[英]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.