是否可以使用 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();
    }
}