我创建了一个观察事件的类。
我是否需要使用@Singleton对此课程进行注释?或@Startup强制它在应用程序启动时监听?
或者它是否足以创建一个类,使用@Observes注释该方法并完成它?
答案 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
注释。