[英]EJB bean lifecycle dependencies?
在规范中找不到关于使用@EJB或@Inject进行依赖项注入如何与容器的bean生命周期管理进行交互的清晰说明。
我想将单例bean A注入到单例bean B中。我希望容器确保在调用B的@PostConstruct方法时A存在,并且一直存在直到B的@PreDestroy方法完成为止。
CDI和EJB是两个不同的规范。 CDI提供了集成,使您可以像使用CDI一样使用EJB Bean(反之亦然!)。 因此,请注意您是在使用CDI还是EJB,因为并非所有注释都适用于所有bean。 例如,@ @Singleton
(EJB)可以具有@Startup
,而CDI中的@ApplicationScoped
bean则不能。
您提到的是“单粒豆”。 为了消除混乱,在EJB中表示@Singleton
,在CDI中表示@ApplicationScoped
bean。
话虽这么说,对你的问题:
@Inject
应该工作以及只要你使用它来创建这些bean中的非循环依赖-例如,如果你使用@Inject
在一个bean的构造函数,CDI将首先启动的依赖比这个bean尝试使用。 请记住,尽管CDI懒惰地启动事情-在您实际尝试使用该bean之前什么也不会发生。
不知道你的意思在这里是什么- @EJB
是EJB相当于@Inject
在CDI。
这也将是一个选项,但是再次注意,它只能在EJB @Singleton
Bean上使用(这很好,在这里仅表示CDI与EJB的区别)。
注入(CDI)不属于EJB规范。 这可能是特定于供应商的行为。 将EJB注入与EJB一起使用。 CDI规范的这一部分可能会有所帮助: cdi规范:与其他规范的关系
和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实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.