Можно ли создать bean-компонент с помощью new (), не используя его внутренние компоненты? - PullRequest
1 голос
/ 20 февраля 2020

Я использую Weld для CDI. Я ищу способ запустить поток periodi c, который включает в себя вставленные 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();
    }
}

Проблема в том, что как только я создаю ExampleThread с помощью new (), это делает его внутренние бины непригодными. Есть ли способ создать ExampleThread таким образом, чтобы он работал?

Ответы [ 3 ]

2 голосов
/ 21 февраля 2020

Просто введите поставщика вместо использования нового:

@Inject
private Provider<ExampleThread> exampleThreadProvider;

...

executorService.scheduleWithFixedDelay(exampleThreadProvider.get(), 1, 1, TimeUnit.SECONDS);
0 голосов
/ 21 февраля 2020

Вы можете внедрить компонент следующим образом:

executorService.scheduleWithFixedDelay(new ExampleThread(), 1, 1, TimeUnit.SECONDS);

и в ExampleThread инициализировать компонент следующим образом:

public class ExampleThread implements Runnable
{
    private SomeBean someBean;

    public ExampleThread()
    {
        this.someBean = CDI.current().select(SomeBean.class).get();
    }

    @Override
    public void run() {
        someBean.do();
    }
}
0 голосов
/ 20 февраля 2020

Вместо этого вы могли бы передать ссылку на bean-объект CDI в исполняемый объект через его конструктор. Примерно так:

@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();
    }
}
...