在规范中找不到关于使用@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的区别)。

10-04 15:03
查看更多