JNDI(Java Naming Directory Interface)
来源:网络 更新时间:2014-12-6
命名服务(namingservice)
命名服务是计算机系统中的一个基本功能。命名服务是将名字和计算机中的一个对象相关联,通过名字可以方便地找到对应的对象。例如,计算机中的文件系统就包含了一个命名服务,你可以通过文件名找到对应的文件对象。
目录服务(directoryservice)
目录服务是命名服务的延伸,目录服务不只保存对象和对象名的匹配,而且保存这个对象的各种属性,你可以对这些属性进行查询、修改、增加、删除操作。
JNDI(JavaNamingDirectoryInterface)
JNDI是一些标准API接口,Java程序通过这些API可以访问命名目录服务。JNDI的定义不依赖于任何独立的命名目录服务器,对于各种命名目录服务器,都可通过统一的JNDI接口调用。JNDI结构如下:
JNDI结构包括两组API:JNDIAPI(ApplicationProgrammingInterface)和JNDISPI(ServiceProviderInterface)。Java应用程序通过JNDIAPI访问各种命名目录服务。JNDISPI使得各种命名目录服务透明地加入到JNDI结构中,如上图中的LDAP、DNS、NIS等服务通过JNDISPI加入到JNDI结构中,从而使Java应用程序能够通过JNDIAPI访问这些服务。
JNDIContext
Context是一系列命名到对象绑定的集合,Context提供以下主要接口访问命名服务:
bind(Namename,Objectobj)建立一个命名到一个对象的匹配关系,也叫绑定
lookup(Stringname)通过命名查找其对应的对象
rebind(Namename,Objectobj)重新绑定一个命名到对象,覆盖原来的绑定
unbind(Namename)解除这个命名到其匹配对象的绑定关系
......
ApusicJNDI应用举例
ApusicApplicationServer包含一个完全遵循JNDI标准的命名服务器,下面我们举例说明如何通过JNDI接口找到你需要调用的EJBHome接口。
Contextctx=null;
try{
Hashtableenv=newHashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.apusic.jndi.InitialContextFactory");
env.put(Context.PROVIDER_URL,"rmi://localhost:6888");
env.put(Context.SECURITY_PRINCIPAL,null);
env.put(Context.SECURITY_CREDENTIALS,null);
ctx=newInitialContext(env);
}catch(Exceptione){
System.err.println("Cannotgetinitialcontext:" e);
System.exit(1);
}
AccountHomehome=null;
try{
home=(AccountHome)ctx.lookup("CMAccountHome");
}catch(Exceptione){
System.err.println("CannotlookupCMAccountHome" e);
System.exit(1);
}
首先,通过Hashtableenv传递JNDI调用参数,取得JNDIContextctx,各参数说明如下:
Context.INITIAL_CONTEXT_FACTORY:指定jndi环境的工厂,在Apusic中必须为com.apusic.jndi.InitialContextFactory
Context.PROVIDER_URL:指定命名服务提供者的URL,格式为:rmi://localhost:6888
Context.SECURITY_PRINCIPAL:指定用户身份,null为“匿名用户”
Context.SECURITY_CREDENTIALS:指定用户密码,同上
然后,通过JNDIContextctx的lookup方法找到"CMAccountHome"绑定的CMAccountBean的Home接口。