我在规范中找不到任何关于 @EJB 或 @Inject 的依赖注入(inject)如何与容器的 bean 生命周期管理交互的明确声明。
我想将单例 bean A 注入(inject)单例 bean B。我希望容器保证 A 在调用 B 的 @PostConstruct 方法时存在,并继续存在直到 B 的 @PreDestroy 方法完成后。
- @Inject(CDI 注入(inject))会实现这一目标吗?
- @EJB 怎么样?
- 或者我总是需要添加@DependsOn?
最佳答案
CDI和EJB是两种不同的规范。 CDI 提供集成,允许您像使用 CDI 一样使用 EJB bean(但反之则不然!)。因此请注意您是在谈论 CDI 还是 EJB,因为并非所有注释都适用于所有 bean。例如@Singleton
(EJB)可以有@Startup
,而@ApplicationScoped
CDI 的 bean 不能。
您提到的是“singleton bean”。为了消除困惑,在 EJB 中这意味着 @Singleton
,在 CDI 中这意味着 @ApplicationScoped
bean 。
话虽如此,对于您的问题:
- @Inject(CDI 注入(inject))会实现这一目标吗?
@Inject
只要您使用它在这些 bean 之间创建非循环依赖关系,就应该可以正常工作 - 例如如果您使用 @Inject
在一个 bean 的构造函数中,CDI 将首先启动该 bean 尝试使用的依赖关系。请记住,CDI 是懒惰地启动事情的——直到您真正尝试使用该 bean 之前什么也不会发生。
- @EJB 怎么样?
不确定你的意思 - @EJB
是 EJB 等效项 @Inject
在 CDI 中。
- 或者我总是需要添加@DependsOn?
这也是一个选项,但再次注意,这只能在 EJB @Singleton
上使用beans(这完全没问题,只是在这里表示 CDI 与 EJB 的差异)。
关于java - EJB bean 生命周期依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53018377/