@PostConstruct вызывается каждый раз, когда приходит событие

Я использую CDI (Weld) в приложении Java SE. Я сделал Bean, назовем его BeanA.

public class BeanA {
    @PostConstruct
    public void init() {
        System.out.println("INIT");
    }

    public void receive(@Observes String test) {
        System.out.println("received: " + test);
    }
}

В моем тестовом методе я вызываю:

Weld weld = new Weld();
WeldContainer container = weld.initialize();
Instance<BeanA> instance = container.instance().select(BeanA.class);
BeanA bean = instance.get();

container.event().fire("TEST");
container.event().fire("TEST");
container.event().fire("TEST");
container.event().fire("TEST");

Почему выход такой? Почему @PostConstruct вызывается каждый раз при получении события?:

INIT
INIT
получено: TEST
INIT
получено: TEST
INIT
получено: TEST
> INIT
получено: TEST


person ryan    schedule 26.11.2014    source источник


Ответы (1)


Это связано с тем, что областью действия bean-компонентов по умолчанию является @Dependent. Это означает, что каждый раз, когда вы запускаете событие, необходимо создать новый экземпляр вашего компонента-наблюдателя, чтобы ему было отправлено событие. @PostConstruct вызывается как часть этого создания.

Аннотируйте свой тип BeanA с помощью @Singleton, чтобы установить его область действия как singleton. Для вашего контейнера будет создан только один.

person Sotirios Delimanolis    schedule 26.11.2014
comment
Вам лучше использовать @ApplicationScoped, а не @Singleton, поведение такое же, но область действия, предоставляемая CDI, нормальна. - person John Ament; 27.11.2014
comment
Хорошо, но что, если я хочу иметь около 10 объектов BeanA и отправлять события им всем? - person ryan; 27.11.2014
comment
@ryan В настоящее время я не знаю, как это сделать. - person Sotirios Delimanolis; 28.11.2014
comment
@ryan, пожалуйста, задайте это как отдельный вопрос. - person John Ament; 28.11.2014