簡體   English   中英

對於另一個注入的CDI bean,是否需要@DependsOn?

[英]Is @DependsOn necessary for another CDI bean that is injected?

給定兩個用@Startup注釋的bean:

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

@Singleton    
@Startup
public B {}

在這種情況下,是否需要@DependsOn來確保B在A之前初始化? 還是在配置方面有約定,在這種情況下,注入順序決定了初始化順序?

官方教程不涉及這種情況,僅涉及在語義上涉及到的bean,而沒有通過@Inject進行任何語法/接線的鏈接。

是的,這是必要的。

否則,不能保證B將在A之前初始化。

根據JavaEE 6文檔

有時,多個單例會話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

如果bean A實際上依賴於正在初始化的bean B,那么您需要這樣做。

使用@Startup時,您將執行急切的實例化-在啟動時實例化單例,無論是否使用它。

在延遲實例化中,單例直到第一個需要它的方法時才被實例化。

在這兩種情況下,容器都可以按其想要的任何順序初始化bean:

有時,多個單例會話bean用於初始化應用程序的數據,因此必須按特定順序進行初始化。 在這些情況下,請使用javax.ejb.DependsOn批注聲明單例會話bean的啟動依賴性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM