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