2012-05-10 118 views
2

我不知道......比方說,我在EJB 3.1 2個無狀態bean:@EJB的無狀態bean保證是唯一的ejb實例?

  1. @Stateless Class1的

    @EJB MyUniqueInstanceBean uniqueBean1;

2.

@Stateless 
Class2 

@EJB MyUniqueInstanceBean uniqueBean2; 

是uniqueBean1和uniqueBean2保證是MyUniqueInstanceBean的唯一實例?

+1

1.編輯您的問題以便讓您的代碼格式化,並且在必要時不要忘記使用括號(MyUniqueInstanceBean是在Class1和Class2中注入的?)。 2.答案取決於你如何定義MyUniqueInstanceBean:答案是肯定的,當且僅當它是一個Singleton – perissf

回答

2

如果MyUniqueInstanceBean是無狀態它不在你的手中,調用uniquebean1和uniquebean2實際調用同一個實例。在EJB 3.1規範這種雜糅了下面的話:

因爲無狀態會話bean的所有實例都是等價的, 容器可以選擇委託客戶端調用的方法,以任何 可用實例。這意味着,例如,容器可能會將來自同一個事務 中同一客戶端的請求委託給不同的實例,並且容器可能會將來自多個事務的請求 交織到同一實例。

如果MyUniqueInstanceBean是有狀態,可以保證uniquebean1和uniquebean2不是指同一個實例。再從規格:

當客戶端通過依賴 注入或JNDI查找獲得 參考有狀態會話bean實例的會話bean實例的生命開始時,或當客戶機調用創建的會話Bean的home方法接口。這會導致容器在會話bean類上調用newInstance以 創建一個新的會話bean實例。

如果您正在使用辛格爾頓,則都指向同一個實例,因爲只有一個實例:

一個單獨的會話bean是一個會話Bean組件,每個應用程序 實例化一次。在分佈在許多虛擬機上的容器爲 的情況下,每個應用程序將爲每個JVM擁有一個單一實例的 。

+0

感謝您的澄清。我懷疑有狀態將保證Class1和Class2的唯一實例。 – user899757

+0

當調用2個不同的無狀態bean的客戶端是同一個客戶端時,如何在2個不同的無狀態bean中使用相同的有狀態bean實例? – jch

相關問題