【问题标题】:@PostConstruct in invoked everytime an event come每次发生事件时都会调用 @PostConstruct
【发布时间】:2015-01-25 09:47:30
【问题描述】:

我在 Java SE 应用程序中使用 CDI(焊接)。我做了一个 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?:

初始化
初始化
收到:测试
初始化
收到:测试
初始化
收到:测试
初始化
收到:测试

【问题讨论】:

    标签: java cdi


    【解决方案1】:

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

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

    【讨论】:

    • 你最好使用@ApplicationScoped 而不是@Singleton,行为是一样的,但是CDI提供的范围是正常的。
    • 好的,但是如果我想拥有 10 个 BeanA 对象并将事件发送给所有对象怎么办?
    • @ryan 我目前不知道该怎么做。
    • @ryan 请作为一个单独的问题提出。
    猜你喜欢
    • 1970-01-01
    • 2011-02-17
    • 2015-10-05
    • 2011-03-04
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    相关资源
    最近更新 更多