【问题标题】:Is @DependsOn necessary for another CDI bean that is injected?注入的另一个 CDI bean 是否需要 @DependsOn?
【发布时间】:2015-08-28 08:53:01
【问题描述】:

给定两个用 @Startup 注释的 bean:

@Singleton    
@Startup
@DependsOn("B")
public A {
  @Inject
  private B b;
}

@Singleton    
@Startup
public B {}

在这种情况下是否需要 @DependsOn 以确保 B 在 A 之前初始化?或者是否有一些配置约定,在这种情况下注入的顺序决定了初始化的顺序?

官方教程没有涵盖这种情况,而仅涵盖语义上没有任何通过@Inject 的句法/接线链接的bean。

【问题讨论】:

    标签: java jakarta-ee cdi


    【解决方案1】:

    如果 bean A 实际上依赖于正在初始化的 bean B,那么你需要这个。

    使用@Startup 你正在做急切的实例化——单例在启动时被实例化,不管它是否被使用。

    在惰性实例化中,直到第一次需要它的方法时才会实例化单例。

    在这两种情况下,容器都可以按照它想要的任何顺序初始化 bean:

    有时多个单例会话 bean 用于初始化应用程序的数据,因此必须按特定顺序进行初始化。在这些情况下,使用 javax.ejb.DependsOn 注解来声明单例会话 bean 的启动依赖项。

    【讨论】:

      【解决方案2】:

      是的,这是必要的。

      否则无法保证B 将在A 之前初始化。

      根据JavaEE 6 documentation

      有时,多个单例会话 bean 用于初始化应用程序的数据,因此必须按特定顺序进行初始化。在这些情况下,使用 javax.ejb.DependsOn 注释来声明单例会话 bean 的启动依赖项。 @DependsOn 注释的 value 属性是一个或多个字符串,用于指定目标单例会话 bean 的名称。如果在@DependsOn 中指定了多个依赖单例 bean,则它们的列出顺序不一定是 EJB 容器初始化目标单例会话 bean 的顺序。

      例子:

      应首先启动以下单例会话 bean PrimaryBean

      @Singleton
      public class PrimaryBean { ... }
      

      SecondaryBean 依赖于PrimaryBean

      @Singleton
      @DependsOn("PrimaryBean")
      public class SecondaryBean { ... }
      

      这保证了 EJB 容器将在 SecondaryBean 之前初始化 PrimaryBean

      【讨论】:

      • 如果我真的需要 @DependsOn 注释,它总是困扰着我。因为如果 SecondaryBean 需要 PrimaryBean 这可能意味着 PB 被注入 SB 并在某处使用,因此保证 PB 在我第一次在 SB 中使用之前被初始化。现实世界中是否存在 SB 依赖 PB 但不使用它的案例?
      • @rychu 是的,有一些例子,在我们的例子中,@Startup Bean 正在注册额外的配置源。然后可以通过特定注释完全解耦注入配置。在@Startup Bean 中执行注入时,可能会发生配置加载器 bean 尚未初始化并且注入点只会返回 null 的情况,这可能是一个有效值,但由于从未加载过配置,因此会出错.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 2014-06-02
      • 2021-12-05
      • 2015-04-15
      相关资源
      最近更新 更多