EJB bean 生命周期依赖关系?

我在规范中找不到任何关于 @EJB 或 @Inject 的依赖注入如何与容器的 bean 生命周期管理交互的明确说明。

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

  1. @Inject(CDI 注入)会做到这一点吗?

  2. @EJB 怎么样?

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


慕田峪9158850
浏览 174回答 2
2回答

慕码人8056858

CDI 和 EJB 是两种不同的规范。CDI 提供了集成,允许您像使用 CDI 一样使用 EJB bean(但反之亦然!)。所以请注意您是在谈论 CDI 还是 EJB,因为并非所有注释都适用于所有 bean。例如@Singleton(EJB) 可以有@Startup,而@ApplicationScoped来自 CDI 的 bean 不能。您提到的是“单例豆”。只是为了消除混淆,在 EJB 中这意味着@Singleton,在 CDI 中意味着@ApplicationScopedbean。话虽如此,对于您提出的问题:@Inject(CDI 注入)会做到这一点吗?@Inject只要您使用它在这些 bean 之间创建非循环依赖项,它就应该可以正常工作 - 例如,如果您@Inject在一个 bean 的构造函数中使用,CDI 将首先启动该依赖项,而不是该 bean 尝试使用。请记住,CDI 正在惰性启动事物 - 在您实际尝试使用该 bean 之前什么都不会发生。@EJB 怎么样?不确定你在这里的意思 -@EJB是@InjectCDI 中的 EJB 等价物。还是我总是需要添加@DependsOn?这也是一个选项,但同样,请注意,这只能用于 EJB @Singletonbean(这很好,这里只是表示 CDI 与 EJB 的区别)。

斯蒂芬大帝

Inject (CDI) 不是 EJB 规范的一部分。这可能是供应商特定的行为。对 EJB 使用 EJB 注入。也许 CDI 规范的这一部分可能会有所帮助:cdi 规范:与其他规范的关系和 3. 参见 EJB 规范 3.2 第 4.8.1 章:单例会话 Bean 初始化。您没有说明初始化(急切或启动时),因此请参阅文档了解详细信息。在某些情况下,应用程序中的多个单例会话 bean 组件之间存在显式的初始化排序依赖关系。DependsOn 注解用于表达这些依赖关系。在一个单例会话 bean 必须在一个或多个其他单例会话 bean 之前初始化的情况下,使用 DependsOn 依赖项。容器确保在调用 PostConstruct 方法之前已初始化与单例会话 bean 具有 DependsOn 关系的所有单例会话 bean。请注意,如果一个单例会话 bean 只需要从其 PostConstruct 方法调用另一个单例会话 bean,则不需要显式排序元数据。在这种情况下,第一个单例会话 bean 将仅使用 EJB 引用来调用目标单例会话 bean。在这种情况下,获取 EJB 引用(通过注入或查找)并不一定意味着实际创建了相应的单例会话 bean 实例。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java