@DependsOn是否需要注入另一个CDI bean?

时间:2015-06-12 11:02:41

标签: java java-ee cdi

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

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

@Singleton    
@Startup
public B {}

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

官方教程不包括这种情况,但只有语言覆盖的bean没有通过@Inject的任何语法/连接链接。

2 个答案:

答案 0 :(得分:1)

是的,这是必要的。

否则,无法保证在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容器在PrimaryBean之前初始化SecondaryBean

答案 1 :(得分:1)

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

使用@Startup,您正在进行急切的实例化 - 单例在启动时被实例化,无论它是否被使用。

在惰性实例化中,单例不会被实例化,直到首先需要它的方法。

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

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