Java 是否可以使用new()创建一个bean而不使其内部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

我正在使用焊接进行CDI。 我正在寻找一种方法来运行包含注入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

您可以通过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();
    }
}