jndi:java命名和目錄接口
jndi把object和context(還可以有subcontext)組織成一個(gè)jndi樹(shù)
這樣object就可一被綁定到不同的context上面
jndi是一種查找服務(wù),用于查找:
web應(yīng)用環(huán)境變量
EJB和他們的環(huán)境變量
通過(guò)DataSource的數(shù)據(jù)庫(kù)連接池
JMS沒(méi)有表和連接工廠
其他服務(wù)
不要將jndi當(dāng)做數(shù)據(jù)庫(kù)使用
jndi對(duì)象存儲(chǔ)在內(nèi)存中
訪問(wèn)jndi對(duì)象與網(wǎng)絡(luò)性能有關(guān)
jndi樹(shù):
InitialContext是JNDI樹(shù)所有搜索的起點(diǎn)
對(duì)象綁定到j(luò)ndi樹(shù)上,java對(duì)象是樹(shù)葉,context是節(jié)點(diǎn)
一個(gè)綁定把對(duì)象與一個(gè)邏輯名和一個(gè)context關(guān)聯(lián)起來(lái)
創(chuàng)建Initial Context
從服務(wù)器端對(duì)象連接到j(luò)ndi
//創(chuàng)建一個(gè)InitialContext
context ctx=new InitialContext();//鏈接到當(dāng)前的jndi樹(shù)上
從任何一個(gè)地方連接到j(luò)ndi
.創(chuàng)建Environment對(duì)象
weblogic.jndi.Enviroment env=new Weblogix.jndi.Enviroment();
填寫Enviroment
env.setProviderurl("t3://127.0.0.1:7001");//weblogic server的位置
env.setSecurityPrincipal("system");//安全信息
env.setSecurityCredentiais("password");
//使用Environment對(duì)象創(chuàng)建InitialContext
context ctx=env.getInitialContext();
.hashtable的用法....
創(chuàng)建subcontext
創(chuàng)建一個(gè)用于綁定對(duì)象的subcontext
創(chuàng)建Environment對(duì)象
context ctx=env.getInitialContext();//首先獲得已經(jīng)存在的subcontext或者initialcontext
填寫Environment
context subcontext=ctx.createSubcontext("newSubcontext");
subcontext.rebind("boundobject",object);
subcontext.close();
ctx.close();
其他鏈接到j(luò)ndi的方法:
使用ConstantProperties名和hashtable類:
HashTable env=new HashTable();
env.put(Context.initial_context_factory,"weblogic.jndi.WLInitialContextFactory");
env.put(Context.procider_url,"t3://localhost:7001");
env.put(Context.security_principal,"system");
env.put(Context.crrdentials,"password");
Context ctx=new InitialContext(env);
另一個(gè)例子:使用hardcoded名和properties類
Properties env=new Properties();
env.setProperties("java.naming.factory.initial","weblogic.jndi.WLInitialContextFactory");
env.setProperties("java.naming.provider.url","t3://localhost:7001")
env.setProperties("java.naming.security.principal","system");
env.setProperties("java.naming.security.credentials","password");
Context ctx=new InitialContext(env);
jndi.properties
.jndi.properties文件為所有的Initial Contexts設(shè)置默認(rèn)的屬性
.jndi.properties文件的搜索順序
.classpath
.$JAVA_HOME/lib
實(shí)例:
java.naming.factoyr.initial=weblogic.jndi.WLInitialContextFactory
java.naming.security.url=t3://localhost:7001
java.naming.security.pricipal=system
java.naming.security.credentials=password
使用默認(rèn)值:
Context ctx=new InitialContext();
從jndi查找:
.lookup()從jndi樹(shù)獲得對(duì)象
.通過(guò)lookup()返回的對(duì)象必須映射到他們合適的類型
try{
//先獲得InitialContext
//Context ic=new Context();
Object obj;
obj=ic.lookup("javax.transation.UserTransaction");
UserTransaction ut=(UserTransaction)obj;
ut.begin();
.....
ic.close();
}catch(NamingEcxeption e){....}
遠(yuǎn)程綁定對(duì)象:
.遠(yuǎn)程綁定到遠(yuǎn)程命名服務(wù)的對(duì)象必須是序列化的
.訪問(wèn)命名服務(wù)時(shí),對(duì)象是采用復(fù)制機(jī)制
查找的對(duì)象是序列化到客戶端的
一個(gè)binding實(shí)例:
public static Context getInitialContext()throws NamingException{
創(chuàng)建Environment對(duì)象
weblogic.jndi.Environment env=new Weblogix.jndi.Environment();
填寫Enviroment
env.setProviderurl("t3://127.0.0.1:7001");//weblogic server的位置
env.setSecurityPrincipal("system");//安全信息
env.setSecurityCredentiais("password");
//使用Environment對(duì)象創(chuàng)建InitialContext
context ctx=env.getInitialContext();
return ctx;
}
//獲得Initial Context
Context ctx=getInitialContext();
//創(chuàng)建名為band的對(duì)象
Bank myBank=new Bank();
//把對(duì)象綁定到j(luò)ndi樹(shù)
ctx.rebind("theBank",myBank);
ctx.close();