繁体   English   中英

EJB bean生命周期依赖项?

[英]EJB bean lifecycle dependencies?

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

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

  1. @Inject(CDI注入)会完成此任务吗?
  2. @EJB呢?
  3. 还是我总是需要添加@DependsOn?

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中的非循环依赖-例如,如果你使用@Inject在一个bean的构造函数,CDI将首先启动的依赖比这个bean尝试使用。 请记住,尽管CDI懒惰地启动事情-在您实际尝试使用该bean之前什么也不会发生。

  1. @EJB呢?

不知道你的意思在这里是什么- @EJB是EJB相当于@Inject在CDI。

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

这也将是一个选项,但是再次注意,它只能在EJB @Singleton Bean上使用(这很好,在这里仅表示CDI与EJB的区别)。

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

  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实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM