每次事件发生时都会调用@PostConstruct

时间:2014-11-26 22:09:22

标签: java cdi

我在Java SE应用程序中使用CDI(Weld)。我做了一个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
recived:TEST
INIT
recived:TEST
INIT
recived:TEST
INIT
recived:TEST

1 个答案:

答案 0 :(得分:6)

这是因为bean的默认范围是@Dependent。这意味着每次触发事件时,都需要创建一个新的观察者bean实例,以便将偶数发送给它。 @PostConstruct作为创建的一部分被调用。

使用BeanA@Singleton类型添加注释,将其范围设置为单例。只会为您的容器创建一个。