2015-06-12 38 views
5

给定两个豆@Startup注释:对于注入的另一个CDI bean是否需要@DependsOn?

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

@Singleton  
@Startup 
public B {} 

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

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

回答

1

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

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

在懒惰的实例化中,单例并没有实例化,直到它首先需要方法。

在这两种情况下,容器可以在初始化豆取其为了就是了:

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

1

是的,这是必要的。

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

按照JavaEE 6 documentation

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

例子:

下单会话bean,PrimaryBean,应首先启动:

@Singleton 
public class PrimaryBean { ... } 

SecondaryBean取决于PrimaryBean

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

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

+0

如果我真的需要@DependsOn注解,它总是困扰我。因为如果SecondaryBean需要PrimaryBean,这可能意味着PB被注入到SB中并在某处使用,所以PB在我首次在SB中使用之前保证被初始化。是否存在SB依赖于PB但不使用它的真实世界情况? – rychu