Java ejbbean生命周期依赖关系?

Java ejbbean生命周期依赖关系?,java,ejb,cdi,Java,Ejb,Cdi,我在规范中找不到任何关于@EJB或@Inject的依赖注入如何与容器的bean生命周期管理交互的明确声明 我想将单例bean A注入到单例bean B中。我想让容器保证A在调用B的@PostConstruct方法时存在,并在B的@PreDestroy方法完成之前继续存在 @Inject(CDI-injection)能实现这一点吗 @EJB呢 还是我总是需要添加@DependsOn 注入(CDI)不是EJB规范的一部分。这可能是特定于供应商的行为。在EJB中使用EJB注入。CDI规范的这一部分可能

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

我想将单例bean A注入到单例bean B中。我想让容器保证A在调用B的@PostConstruct方法时存在,并在B的@PreDestroy方法完成之前继续存在

  • @Inject(CDI-injection)能实现这一点吗
  • @EJB呢
  • 还是我总是需要添加@DependsOn
  • 注入(CDI)不是EJB规范的一部分。这可能是特定于供应商的行为。在EJB中使用EJB注入。CDI规范的这一部分可能有助于:

  • 三,。 请参阅EJB Spec 3.2第4.8.1章:Singleton会话Bean初始化。 你没有说任何关于初始化的事情(急切的或在启动时),所以请参考文档了解详细信息

  • 在某些情况下,应用程序中的多个单例会话bean组件之间存在显式的初始化顺序依赖关系。DependsOn注释用于表示这些依赖关系。DependsOn依赖关系用于一个单例会话bean必须在一个或多个其他单例会话bean之前初始化的情况。该容器确保在调用PostConstruct方法之前,已初始化与单例会话bean具有DependsOn关系的所有单例会话bean

    注意,如果一个单例会话bean只需要从其PostConstruct方法调用另一个单例会话bean,则不需要显式排序元数据。在这种情况下,第一个单例会话bean将仅使用EJB引用来调用目标单例会话bean。在这种情况下,获取EJB引用(通过注入或查找)并不一定意味着实际创建相应的单例会话bean实例


    CDI和EJB是两种不同的规范。CDI提供了集成,允许您像使用CDI一样使用EJB bean(但反之亦然!)。所以请注意,您所说的是CDI还是EJB,因为并非所有注释都适用于所有bean。例如,
    @Singleton
    (EJB)可以有
    @Startup
    ,而来自CDI的
    @ApplicationScoped
    bean不能

    你提到的是“单身豆”。为了消除混淆,在EJB中表示
    @Singleton
    ,在CDI中表示
    @ApplicationScoped
    bean

    尽管如此,对于您提出的问题:

  • @Inject(CDI-injection)能实现这一点吗
  • 只要您使用
    @Inject
    在这些bean之间创建一个非循环依赖项,
    @Inject
    也应该可以工作-例如,如果您在一个bean的构造函数中使用
    @Inject
    ,CDI将首先启动依赖项,而不是该bean试图使用的依赖项。请记住,CDI是在懒散地启动事情——除非您真正尝试使用该bean,否则不会发生任何事情

  • @EJB呢
  • 不确定您在这里的意思-
    @EJB
    是CDI中的
    @Inject
    的EJB等价物

  • 还是我总是需要添加@DependsOn

  • 这也是一个选项,但请再次注意,这只能用于EJB
    @Singleton
    bean(这很好,这里只表示CDI与EJB的区别)。

    选项三。我想。