是否可以使用 new() 创建一个 bean 而不会使其内部 bean 不可用?
is it possible to create a bean using new() without making its inner beans unusable?
我正在为 CDI 使用 Weld。
我正在寻找一种方法来 运行 包含注入 bean 的周期性线程。
主要我想创建:
executorService.scheduleWithFixedDelay(new ExampleThread(), 1, 1, TimeUnit.SECONDS);
其中 ExampleThread 是:
@ApplicationScoped
public class ExampleThread implements Runnable {
@Inject
private SomeBean someBean;
public ExampleThread() {}
@Override
public void run() {
someBean.do();
}
}
问题是,一旦我使用 new() 创建 ExampleThread,它就会使其内部 bean 无法使用。
有没有办法以可行的方式创建 ExampleThread?
您可以改为通过其构造函数将 CDI bean 的引用传递给可运行对象。像这样:
@ApplicationScoped
public class Foo
{
@Inject
private SomeBean someBean;
// ...
public void someMethod()
{
// ...
executorService.scheduleWithFixedDelay(new ExampleThread(someBean), 1, 1, TimeUnit.SECONDS);
}
}
public class ExampleThread implements Runnable
{
private SomeBean someBean;
public ExampleThread(SomeBean someBean)
{
this.someBean = someBean;
}
@Override
public void run() {
someBean.do();
}
}
简单地注入一个提供者而不是使用新的:
@Inject
private Provider<ExampleThread> exampleThreadProvider;
...
executorService.scheduleWithFixedDelay(exampleThreadProvider.get(), 1, 1, TimeUnit.SECONDS);
你可以这样注入 bean:
executorService.scheduleWithFixedDelay(new ExampleThread(), 1, 1, TimeUnit.SECONDS);
并在 ExampleThread 中按以下方式初始化 bean:
public class ExampleThread implements Runnable
{
private SomeBean someBean;
public ExampleThread()
{
this.someBean = CDI.current().select(SomeBean.class).get();
}
@Override
public void run() {
someBean.do();
}
}
我正在为 CDI 使用 Weld。 我正在寻找一种方法来 运行 包含注入 bean 的周期性线程。
主要我想创建:
executorService.scheduleWithFixedDelay(new ExampleThread(), 1, 1, TimeUnit.SECONDS);
其中 ExampleThread 是:
@ApplicationScoped
public class ExampleThread implements Runnable {
@Inject
private SomeBean someBean;
public ExampleThread() {}
@Override
public void run() {
someBean.do();
}
}
问题是,一旦我使用 new() 创建 ExampleThread,它就会使其内部 bean 无法使用。 有没有办法以可行的方式创建 ExampleThread?
您可以改为通过其构造函数将 CDI bean 的引用传递给可运行对象。像这样:
@ApplicationScoped
public class Foo
{
@Inject
private SomeBean someBean;
// ...
public void someMethod()
{
// ...
executorService.scheduleWithFixedDelay(new ExampleThread(someBean), 1, 1, TimeUnit.SECONDS);
}
}
public class ExampleThread implements Runnable
{
private SomeBean someBean;
public ExampleThread(SomeBean someBean)
{
this.someBean = someBean;
}
@Override
public void run() {
someBean.do();
}
}
简单地注入一个提供者而不是使用新的:
@Inject
private Provider<ExampleThread> exampleThreadProvider;
...
executorService.scheduleWithFixedDelay(exampleThreadProvider.get(), 1, 1, TimeUnit.SECONDS);
你可以这样注入 bean:
executorService.scheduleWithFixedDelay(new ExampleThread(), 1, 1, TimeUnit.SECONDS);
并在 ExampleThread 中按以下方式初始化 bean:
public class ExampleThread implements Runnable
{
private SomeBean someBean;
public ExampleThread()
{
this.someBean = CDI.current().select(SomeBean.class).get();
}
@Override
public void run() {
someBean.do();
}
}