|
Context initial = new InitialContext(); Object objref = initial.lookup("java:comp/env/ejb/SimpleConverter");
一般情況下,intial.lookup("")中的參數(shù)就是你的JNDI名稱。但是用的應(yīng)用服務(wù)器,是把JNDI名放到j(luò)ava:comp/env/ejb/后面的。兩種方式都沒有錯。比如: TomCat5.0中使用的是Object objref = initial.lookup("java:comp/env/ejb/SimpleConverter"); WebLogic6.1中使用的是: Object objref = initial.lookup("HelloHome");
InitialContext的構(gòu)造方法主要是準(zhǔn)備JNDI的訪問環(huán)境,如果不加參數(shù),那就意味著是用本地匿名訪問,也就是說,用戶角色是匿名,ctx.PROVIDER_URL是LOCALHOST 所以,對于本地測試(并且JNDI資源沒有設(shè)置安全屬性)這兩段代碼沒有區(qū)別,如果要訪問遠(yuǎn)程的JNDI資源,就必須用飽含JNDI環(huán)境參數(shù)Hashtable初始化InitialContext。
必要的環(huán)境參數(shù)如: Context.INITIAL_CONTEXT_FACTORY//連接工廠 Context.PROVIDER_URL//訪問連接 Context.SECURITY_PRINCIPAL//安全用戶 Context.SECURITY_CREDENTIALS//用戶密碼
EJBLocalHome->本地主接口,負(fù)責(zé)控制Bean的整個生命周期,另外,可以看作是 生成Bean引用的 “工廠“類。
EJBLocalObject->本地組件接口,定義Bean要向客戶提供的業(yè)務(wù)方法的簽名。
本地接口是一種輕量級代理,語法更簡單(直接類型轉(zhuǎn)換,不需要narrow),
開銷更小,速度更快。規(guī)范說可以在同一JVM內(nèi)使用,我只在同一個EJB包內(nèi)用過。 EJBLocalHome+EJBLocalObject vs EJBHome+EJBObject: 前一對不是遠(yuǎn)程調(diào)用,省時省力 Home vs Object: 前者是Factory模式,用來生成后者;后者是proxy模式,用來暴露商業(yè)邏輯
InitialContext context = new InitialContext(); Object ref = context.lookup(JNDIname); accHome = (AccountHome)PortableRemoteObject.narrow(ref,AccountHome.class); ejbObject = accHome.create(); 上面即是ejb實例的一個很常見的創(chuàng)建過程 理解如下: 上面的創(chuàng)建過程是通過遠(yuǎn)程接口創(chuàng)建ejb實例的過程:即先通過JNDIname找到ejb本地接 口的一個實例,然后再通過本地接口的實例創(chuàng)建ejb實例,PortableRemoteObject.narrow(ref,AccountHome.class); 實際上是一個強(qiáng)制轉(zhuǎn)換,由于是遠(yuǎn)程強(qiáng)制轉(zhuǎn)換,所以要用PortableRemoteObject.narrow()方法。
// 創(chuàng)建一個JNDI naming contest Context initial = new InitialContext(); // 從JNDI 中以MyConverter 名子來定位到對象(在發(fā)布名稱指定了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 方法來創(chuàng)建一個服務(wù)器上的EJB實例 Converter currencyConverter = home.create(); // 調(diào)用EJB 中的方法 代碼省略
|