jndi:java命名和目录接口
jndi把object和context(还可以有subcontext)组织成一个jndi树
这样object就可一被绑定到不同的context上面
jndi是一种查找服务,用于查找:
web应用环境变量
EJB和他们的环境变量
通过DataSource的数据库连接池
JMS没有表和连接工厂
其他服务
不要将jndi当做数据库使用
jndi对象存储在内存中
访问jndi对象与网络性能有关
jndi树:
InitialContext是JNDI树所有搜索的起点
对象绑定到jndi树上,java对象是树叶,context是节点
一个绑定把对象与一个逻辑名和一个context关联起来
创建Initial Context
从服务器端对象连接到jndi
//创建一个InitialContext
context ctx=new InitialContext();//链接到当前的jndi树上
从任何一个地方连接到jndi
.创建Environment对象
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对象创建InitialContext
context ctx=env.getInitialContext();
.hashtable的用法....
创建subcontext
创建一个用于绑定对象的subcontext
创建Environment对象
context ctx=env.getInitialContext();//首先获得已经存在的subcontext或者initialcontext
填写Environment
context subcontext=ctx.createSubcontext("newSubcontext");
subcontext.rebind("boundobject",object);
subcontext.close();
ctx.close();
其他链接到jndi的方法:
使用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);
另一个例子:使用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设置默认的属性
.jndi.properties文件的搜索顺序
.classpath
.$JAVA_HOME/lib
实例:
java.naming.factoyr.initial=weblogic.jndi.WLInitialContextFactory
java.naming.security.url=t3://localhost:7001
java.naming.security.pricipal=system
java.naming.security.credentials=password
使用默认值:
Context ctx=new InitialContext();
从jndi查找:
.lookup()从jndi树获得对象
.通过lookup()返回的对象必须映射到他们合适的类型
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){....}
远程绑定对象:
.远程绑定到远程命名服务的对象必须是序列化的
.访问命名服务时,对象是采用复制机制
查找的对象是序列化到客户端的
一个binding实例:
public static Context getInitialContext()throws NamingException{
创建Environment对象
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对象创建InitialContext
context ctx=env.getInitialContext();
return ctx;
}
//获得Initial Context
Context ctx=getInitialContext();
//创建名为band的对象
Bank myBank=new Bank();
//把对象绑定到jndi树
ctx.rebind("theBank",myBank);
ctx.close();