2015-06-12 40 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