2015-07-03 52 views
0

我正在研究EJB查找的洞察力,並試圖瞭解容器和池如何工作。我創建了一些測試應用程序,我將解釋每一個應用程序。EJB內部查找:構造函數,@PostConstruct

先執行:查找內部構造函數類的構造函數(糟糕的做法)內進行

@Stateless 
    public class EjbTest { 

    protected EjbInjectedLocal  ejbInjected; 

    public EjbTest() { 
      InitialContext ic = new InitialContext(); 
      ejbInjected = (EjbInjectedLocal)ic.lookup("java:comp/env/ejb/EjbInjected"); 
      ic.close(); 
    } 

    public void test() { 
     ejbInjected.callSomeMethod(); 
     return; 
    } 

} 

注射,但一切正常。構造函數檢索EJB的代理。當我調用方法test()時,它會正確執行。

第二實施:查找內部@PostConstruct

@Stateless 
public class EjbTest { 

    protected EjbInjectedLocal  ejbInjected; 

    public EjbTest() { 
    } 

    @PostConstruct 
    public start() { 
      InitialContext ic = new InitialContext(); 
      ejbInjected = (EjbInjectedLocal)ic.lookup("java:comp/env/ejb/EjbInjected"); 
      ic.close(); 
    } 

    public void test() { 
     ejbInjected.callSomeMethod(); 
     return; 
    } 

} 

如在現有例子中,查找工作正常,以及所述方法測試。

三實現:構造函數和函數執行

@Stateless 
public class EjbTest { 

    protected EjbInjectedLocal  ejbInjected; 

    public EjbTest() { 
      InitialContext ic = new InitialContext(); 
      ejbInjected = (EjbInjectedLocal)ic.lookup("java:comp/env/ejb/EjbInjected"); 
      ejbInjected.callSomeMethod(); 
      ic.close(); 
    } 

} 

內查找使用這種實現,查找工作正常,但功能停止/凍結線程,因爲容器尚未準備好來無回代理實現,但是整個EJB和函數都無法執行。

當構造函數被調用時,bean尚未被初始化並且沒有依賴被注入?只有代理被返回,但它尚不可用,無法從池中檢索整個EJB?

回答

2

EJB specification(4.3.10.2):

由於無狀態會話bean實例通常彙集,創建方法的客戶端調用時 不必爲容器的調用任何 直接關係對無狀態會話bean實例的PostConstruct/ejbCreate方法的 。

這是特定於容器的行爲,規範將其作爲實現者進行創新的區域開放。實現甚至不要求使用Bean池,併成爲可用的任何延遲加載行爲的確切順序豆到容器中,如爲他們提供他們的用戶的配置,例如:

http://docs.jboss.org/ejb3/docs/reference/1.0.7/html/SessionBean_and_MDB_configuration.html

關於實例化過程中的調用序列,規範(第4.3.10節)說:

容器按如下方式創建會話bean的實例。首先, 容器調用bean類的newInstance方法來創建一個 新的會話bean實例。其次,容器執行任何 依賴注入,如bean 類上的元數據註釋或部署描述符所指定的。這包括Bean的 SessionContext(如果適用)。第三,容器爲這個bean調用 PostConstruct生命週期回調攔截器方法,如果是 任何。如果會話bean是通過EJB 2.1客戶端視圖API調用的 ,則下面描述的附加步驟適用。

尤其是,任何依賴注入字段(即使用EJB註釋)在此時都將爲空。通過使用InitialContext你已經繞過了這個約束,這是意外行爲的原因。

根據您描述的行爲,聽起來好像您的容器正在構建bean,因此EjbInjectedLocal bean在您嘗試調用它的位置不可用。我很驚訝它僵局,但並不驚訝它沒有奏效。在其他容器上嘗試相同的實驗並查看是否得到相同的結果會很有趣。

0

只返回代理,但它尚不可用,無法從池中檢索整個EJB?

這是正確的。你只是在這裏陷入僵局。

+0

調用方法EjbTest()時,EJB代理可用,但在調用@PostConstruct方法(類構造函數完成之後)之前,EjbTest EJB尚未準備好。但是第三個例子很少有工作正常..這只是一個時間任務完成的問題? – StarsSky