Java 是否可以使用new()创建一个bean而不使其内部bean不可用?
我正在使用焊接进行CDI。 我正在寻找一种方法来运行包含注入bean的周期线程 我主要想创建:Java 是否可以使用new()创建一个bean而不使其内部bean不可用?,java,jakarta-ee,cdi,weld,Java,Jakarta Ee,Cdi,Weld,我正在使用焊接进行CDI。 我正在寻找一种方法来运行包含注入bean的周期线程 我主要想创建: executorService.scheduleWithFixedDelay(new ExampleThread(), 1, 1, TimeUnit.SECONDS); 其中,ExampleThread是: @ApplicationScoped public class ExampleThread implements Runnable { @Inject private Some
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 您可以通过CDIBean的构造函数将CDIBean的引用传递给可运行对象。大概是这样的:
@ApplicationScoped
public class Foo
{
@Inject
private SomeBean someBean;
// ...
public void someMethod()
{
// ...
executorService.scheduleWithFixedDelay(new ExampleThread(someBean), 1, 1, TimeUnit.SECONDS);
}
}
只需插入提供程序,而不使用新的:
@Inject
private Provider<ExampleThread> exampleThreadProvider;
...
executorService.scheduleWithFixedDelay(exampleThreadProvider.get(), 1, 1, TimeUnit.SECONDS);
@Inject
私人提供商示例ThreadProvider;
...
executorService.scheduleWithFixedDelay(例如ThreadProvider.get(),1,1,TimeUnit.SECONDS);
您可以通过以下方式注入bean:
executorService.scheduleWithFixedDelay(new ExampleThread(), 1, 1, TimeUnit.SECONDS);
在示例中,线程按以下方式初始化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();
}
}
答案提供了一些有效的指针——我的首选是通过构造函数传递依赖项。但是,您能否提供更多信息,说明为什么希望在每次计划执行时重新创建
Runnable
?我的印象是,使用@ApplicationScoped
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();
}
}