【轉】InitialContext與lookup


Context initial = new InitialContext();
Object objref = initial.lookup("java:comp/env/ejb/SimpleConverter");    

一般情況下,intial.lookup("")中的參數就是你的JNDI名稱。但是用的應用服務器,是把JNDI名放到java:comp/env/ejb/后面的。兩種方式都沒有錯。比如:
TomCat5.0中使用的是Object objref = initial.lookup("java:comp/env/ejb/SimpleConverter"); WebLogic6.1中使用的是:
Object objref = initial.lookup("HelloHome");

InitialContext的構造方法主要是准備JNDI的訪問環境,如果不加參數,那就意味着是用本地匿名訪問,也就是說,用戶角色是匿名,ctx.PROVIDER_URL是LOCALHOST
所以,對於本地測試(並且JNDI資源沒有設置安全屬性)這兩段代碼沒有區別,如果要訪問遠程的JNDI資源,就必須用飽含JNDI環境參數Hashtable初始化InitialContext。

必要的環境參數如:
Context.INITIAL_CONTEXT_FACTORY//連接工廠
Context.PROVIDER_URL//訪問連接
Context.SECURITY_PRINCIPAL//安全用戶
Context.SECURITY_CREDENTIALS//用戶密碼 

EJBLocalHome->本地主接口,負責控制Bean的整個生命周期,另外,可以看作是
生成Bean引用的
“工廠“類。  

EJBLocalObject->本地組件接口,定義Bean要向客戶提供的業務方法的簽名。

本地接口是一種輕量級代理,語法更簡單(直接類型轉換,不需要narrow),

開銷更小,速度更快。規范說可以在同一JVM內使用,我只在同一個EJB包內用過。
EJBLocalHome+EJBLocalObject   vs   EJBHome+EJBObject:  
  前一對不是遠程調用,省時省力   
Home   vs   Object:  
  前者是Factory模式,用來生成后者;后者是proxy模式,用來暴露商業邏輯

InitialContext context = new InitialContext();          
Object ref = context.lookup(JNDIname);          
accHome = (AccountHome)PortableRemoteObject.narrow(ref,AccountHome.class);      
ejbObject = accHome.create();  
  上面即是ejb實例的一個很常見的創建過程  
理解如下:  
   上面的創建過程是通過遠程接口創建ejb實例的過程:即先通過JNDIname找到ejb本地接
口的一個實例,然后再通過本地接口的實例創建ejb實例,PortableRemoteObject.narrow(ref,AccountHome.class);
實際上是一個強制轉換,由於是遠程強制轉換,所以要用PortableRemoteObject.narrow()方法。


// 創建一個JNDI naming contest
           Context initial = new InitialContext();
          
           // 從JNDI 中以MyConverter 名子來定位到對象(在發布名稱指定了JNDI名稱)
//         Object objref = initial.lookup("java:comp/env/ejb/ConverterEJB");
           Object objref = initial.lookup("MyConverter");
          
           // 通過objref 得到ConverterHome 本地接口
           ConverterHome home = (ConverterHome)PortableRemoteObject.narrow(
                   objref, ConverterHome.class);
          
           // 再由Home 接口的create 方法來創建一個服務器上的EJB實例
           Converter currencyConverter = home.create();
          
           // 調用EJB 中的方法
           代碼省略


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM