在规范中找不到关于使用@EJB或@Inject进行依赖项注入如何与容器的bean生命周期管理进行交互的清晰说明。
我想将单例bean A注入到单例bean B中。我希望容器确保在调用B的@PostConstruct方法时A存在,并且一直存在直到B的@PreDestroy方法完成为止。
答案 0 :(得分:1)
CDI和EJB是两个不同的规范。 CDI提供了集成,使您可以像使用CDI一样使用EJB Bean(反之亦然!)。因此,请注意您是在使用CDI还是EJB,因为并非所有注释都适用于所有bean。例如@Singleton
(EJB)可以有@Startup
,而CDI的@ApplicationScoped
bean不能。
您提到的是“单粒豆”。为了消除混乱,在EJB中意为@Singleton
,在CDI中意为@ApplicationScoped
bean。
话虽这么说,对你的问题:
@Inject
在这些bean之间创建非循环依赖关系,它就可以正常工作-例如如果在一个bean的构造函数上使用@Inject
,则CDI将首先启动依赖关系,而不是此bean试图使用的依赖关系。请记住,尽管CDI懒惰地启动事情-在您真正尝试使用该bean之前什么也不会发生。
不确定您的意思-@EJB
与CDI中的@Inject
等效。
这也是一种选择,但再次提醒您,此方法只能在EJB @Singleton
bean上使用(这很好,在这里仅表示CDI与EJB的区别)。
答案 1 :(得分:0)
注入(CDI)不属于EJB规范。这可能是特定于供应商的行为。将EJB注入与EJB一起使用。 CDI规范的这一部分可能会有所帮助:cdi spec: relationship to other specifications
和3。 请参见EJB Spec 3.2章节4.8.1:单例会话Bean初始化。 您没有对初始化进行任何说明(急切或在启动时),因此请参阅文档以了解详细信息。
在某些情况下,应用程序中的多个单例会话bean组件之间存在显式的初始化顺序依赖性。 DependsOn批注用于表达这些依赖性。在一个单例会话Bean必须在一个或多个其他单例会话Bean之前初始化的情况下,使用DependsOn依赖项。容器确保在调用PostConstruct方法之前已初始化与单例会话Bean具有DependsOn关系的所有单例会话Bean。
请注意,如果一个单例会话bean仅需要从其PostConstruct方法调用另一个单例会话bean,则不需要显式的排序元数据。在那种情况下,第一个单例会话Bean将仅使用EJB引用来调用目标单例会话Bean。在这种情况下,(通过注入或查找)获取EJB引用不一定意味着实际创建了相应的单例会话bean实例。