使用CDI事件@Observes时是否必须注释类?

时间:2018-02-21 17:50:50

标签: events cdi

我创建了一个观察事件的类。

我是否需要使用@Singleton对此课程进行注释?或@Startup强制它在应用程序启动时监听?

或者它是否足以创建一个类,使用@Observes注释该方法并完成它?

2 个答案:

答案 0 :(得分:1)

首先,@Startup是一个EJB注释,而不是CDI。同样地,@Singleton可以是EJB注释(也有CDI注释,但行为略有不同)。

话虽如此,让我们继续讨论真正的问题。 观察者方法的发现要求它存在于CDI bean上。所以你可以参考什么是CDI bean以及何时找到这样的bean。通过CDI规范中的一些阅读,您会发现这取决于bean discovery mode。如果您有模式all,那么每个类都将成为bean的候选者(@Dependent如果没有使用其他范围注释),您的观察者将被找到并被拾取。

但是,您可以选择使用bean发现模式annotated,其中只有具有所谓bean defining annotations的类归类为bean。在这种情况下,如果在没有bean定义注释的方法上有观察者,则不会检测到它。

简而言之,如果你总是在拥有观察者的类上使用某个范围,那么你是安全的。

答案 1 :(得分:1)

如果您查看章节10.3. Observer resolution中的规范,则会定义:

  

如果出现以下事件,则会将事件传递给观察者方法:
   - observer方法属于一个启用的bean。 [...]

那么什么是bean,根据规范3.1.1. Which Java classes are managed beans?

  

如果Java类满足以下所有条件,则它是托管bean:
   - 这不是内心阶层    - 它是一个非抽象类,或注释@Decorator    - 它没有实现javax.enterprise.inject.spi.Extension    - 它没有注释@Vetoed或注释@Vetoed的包    - 它有一个合适的构造函数 - 或者:
          该类有一个没有参数的构造函数,或者           该类声明了一个注释为@Inject的构造函数。

如果您的班级符合此条件且您已将beans.xml中的bean-discovery-mode设置为“all”,则无需为您的班级添加注释。如果bean-discovery-mode设置为注释,则您的班级必须至少包含@Dependent注释。