2 回答

TA貢獻1803條經(jīng)驗 獲得超6個贊
CDI 和 EJB 是兩種不同的規(guī)范。CDI 提供了集成,允許您像使用 CDI 一樣使用 EJB bean(但反之亦然?。?。所以請注意您是在談論 CDI 還是 EJB,因為并非所有注釋都適用于所有 bean。例如@Singleton
(EJB) 可以有@Startup
,而@ApplicationScoped
來自 CDI 的 bean 不能。
您提到的是“單例豆”。只是為了消除混淆,在 EJB 中這意味著@Singleton
,在 CDI 中意味著@ApplicationScoped
bean。
話雖如此,對于您提出的問題:
@Inject(CDI 注入)會做到這一點嗎?
@Inject
只要您使用它在這些 bean 之間創(chuàng)建非循環(huán)依賴項,它就應該可以正常工作 - 例如,如果您@Inject
在一個 bean 的構(gòu)造函數(shù)中使用,CDI 將首先啟動該依賴項,而不是該 bean 嘗試使用。請記住,CDI 正在惰性啟動事物 - 在您實際嘗試使用該 bean 之前什么都不會發(fā)生。
@EJB 怎么樣?
不確定你在這里的意思 -@EJB
是@Inject
CDI 中的 EJB 等價物。
還是我總是需要添加@DependsOn?
這也是一個選項,但同樣,請注意,這只能用于 EJB @Singleton
bean(這很好,這里只是表示 CDI 與 EJB 的區(qū)別)。

TA貢獻1827條經(jīng)驗 獲得超8個贊
Inject (CDI) 不是 EJB 規(guī)范的一部分。這可能是供應商特定的行為。對 EJB 使用 EJB 注入。也許 CDI 規(guī)范的這一部分可能會有所幫助:cdi 規(guī)范:與其他規(guī)范的關(guān)系
和 3. 參見 EJB 規(guī)范 3.2 第 4.8.1 章:單例會話 Bean 初始化。您沒有說明初始化(急切或啟動時),因此請參閱文檔了解詳細信息。
在某些情況下,應用程序中的多個單例會話 bean 組件之間存在顯式的初始化排序依賴關(guān)系。DependsOn 注解用于表達這些依賴關(guān)系。在一個單例會話 bean 必須在一個或多個其他單例會話 bean 之前初始化的情況下,使用 DependsOn 依賴項。容器確保在調(diào)用 PostConstruct 方法之前已初始化與單例會話 bean 具有 DependsOn 關(guān)系的所有單例會話 bean。
請注意,如果一個單例會話 bean 只需要從其 PostConstruct 方法調(diào)用另一個單例會話 bean,則不需要顯式排序元數(shù)據(jù)。在這種情況下,第一個單例會話 bean 將僅使用 EJB 引用來調(diào)用目標單例會話 bean。在這種情況下,獲取 EJB 引用(通過注入或查找)并不一定意味著實際創(chuàng)建了相應的單例會話 bean 實例。
添加回答
舉報