在规范中找不到关于使用@EJB或@Inject进行依赖项注入如何与容器的bean生命周期管理进行交互的任何明确说明。
我想将单例bean A注入到单例bean B中。我希望容器确保在B的@PostConstruct方法被调用时A存在,并且一直存在直到B的@PreDestroy方法完成为止。
@Inject(CDI注入)会完成此任务吗?
@EJB呢?
还是我总是需要添加@DependsOn?
最佳答案
CDI和EJB是两个不同的规范。 CDI提供了集成,使您可以像使用CDI一样使用EJB Bean(反之亦然!)。因此,请注意您是在谈论CDI还是EJB,因为并非所有注释都适用于所有bean。例如,@Singleton
(EJB)可以具有@Startup
,而CDI中的@ApplicationScoped
bean不能。
您提到的是“单粒豆”。为了消除混乱,在EJB中表示@Singleton
,在CDI中表示@ApplicationScoped
bean。
话虽这么说,对你的问题:
@Inject(CDI注入)会完成此任务吗?
只要您使用@Inject
在这些bean之间创建非循环依赖关系,它就应该可以正常工作-例如如果在一个bean的构造函数中使用@Inject
,则CDI将首先启动该bean尝试使用的依赖项。请记住,尽管CDI懒惰地启动事情-在您实际尝试使用该bean之前什么也不会发生。
@EJB呢?
不确定您的意思-@EJB
是CDI中@Inject
的EJB等效项。
还是我总是需要添加@DependsOn?
这也将是一个选项,但再次注意,它只能在EJB @Singleton
bean上使用(这很好,在这里仅表示CDI与EJB的区别)。