Events 通过producer在创建bean后触发CDI事件

Events 通过producer在创建bean后触发CDI事件,events,cdi,Events,Cdi,我有一个CDI生产者方法,它创建一个UserBean。生产者触发一个UserBeanEvent。其他bean依赖于该用户bean,这些bean可以在observer方法中使用 CDI再次尝试创建用户bean,调用生产者,触发事件,等等——无休止的循环 在制作人完成并将bean完全添加到bean商店之后,是否有任何简洁的方法来触发事件?我查阅了资料,但什么也没找到 我在WildFly 10.1上使用的是WELD 2.3.5.final,您需要详细说明几件事,其中最重要的一件事是范围,在什么时候需要

我有一个CDI生产者方法,它创建一个
UserBean
。生产者触发一个
UserBeanEvent
。其他bean依赖于该用户bean,这些bean可以在observer方法中使用

CDI再次尝试创建用户bean,调用生产者,触发事件,等等——无休止的循环

在制作人完成并将bean完全添加到bean商店之后,是否有任何简洁的方法来触发事件?我查阅了资料,但什么也没找到


我在WildFly 10.1上使用的是WELD 2.3.5.final,您需要详细说明几件事,其中最重要的一件事是范围,在什么时候需要bean

显然,如果有一个observer方法侦听这个bean事件,并且还需要在observer参数中引用这个bean,那么您肯定是在创建一个循环依赖项,您无法解析它,因为CDI中的事件默认是同步的(即使您使用
fireAsync
,也不能保证在事件到达时,CDI已经将bean放入正确的上下文中)

我将通过在一个earger加载的bean上进行方法注入来解决这个问题,比如使用某种earger加载的EJB
Singleton
@ApplicationScoped
,然后从那里触发事件

假设bean已被完全加载:

public class EargerBean {

    @Inject
    private Event<BeanEvent> event;

    @Inject
    public void onInjected(Bean bean){
        BeanEvent beanEvent ...;
        event.fire(beanEvent);
    }

}
公共类EargerBean{
@注入
私人活动;
@注入
未注入的公共无效(Bean){
BeanEvent BeanEvent。。。;
事件。火灾(beanEvent);
}
}

您正在创建一个循环依赖项,这通常是一种不好的模式。请重新思考您的代码,可能有其他方法可以解决这个问题,但由于问题提供的信息很少,很难说。您能否更全面地说明为什么需要在该点触发事件?bean的创建是基于给定范围/上下文,那么您是否希望观察这一点?