EJB bean生命周期依赖项?

时间:2018-10-27 03:02:34

标签: java ejb cdi

在规范中找不到关于使用@EJB或@Inject进行依赖项注入如何与容器的bean生命周期管理进行交互的清晰说明。

我想将单例bean A注入到单例bean B中。我希望容器确保在调用B的@PostConstruct方法时A存在,并且一直存在直到B的@PreDestroy方法完成为止。

  1. @Inject(CDI注入)能做到吗?
  2. @EJB怎么样?
  3. 还是我总是需要添加@DependsOn?

2 个答案:

答案 0 :(得分:1)

CDI和EJB是两个不同的规范。 CDI提供了集成,使您可以像使用CDI一样使用EJB Bean(反之亦然!)。因此,请注意您是在使用CDI还是EJB,因为并非所有注释都适用于所有bean。例如@Singleton(EJB)可以有@Startup,而CDI的@ApplicationScoped bean不能。

您提到的是“单粒豆”。为了消除混乱,在EJB中意为@Singleton,在CDI中意为@ApplicationScoped bean。

话虽这么说,对你的问题:

  1. @Inject(CDI注入)能做到吗?
只要您使用

@Inject在这些bean之间创建非循环依赖关系,它就可以正常工作-例如如果在一个bean的构造函数上使用@Inject,则CDI将首先启动依赖关系,而不是此bean试图使用的依赖关系。请记住,尽管CDI懒惰地启动事情-在您真正尝试使用该bean之前什么也不会发生。

  1. @EJB怎么样?

不确定您的意思-@EJB与CDI中的@Inject等效。

  1. 还是我总是需要添加@DependsOn?

这也是一种选择,但再次提醒您,此方法只能在EJB @Singleton bean上使用(这很好,在这里仅表示CDI与EJB的区别)。

答案 1 :(得分:0)

  1. 注入(CDI)不属于EJB规范。这可能是特定于供应商的行为。将EJB注入与EJB一起使用。 CDI规范的这一部分可能会有所帮助:cdi spec: relationship to other specifications

  2. 和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实例。