相关介绍
JNDI就是java naming and directory interface,就是把一个对象指定一个名字,然后通过这个名字拿这个对象,而且需要在配置的时候指定对象的名字就可以了。在client端,你根本不需要知道你要的对象在什么地方,它的目的就是为了透明。
JNDI能提供访问远程的资源,比如到连接池中去查找连接,可以提高性能。比如在TOMCAT中配置一个数据源后,可以在应用程序中通过JNDI查找获得数据源:
示例代码:
Context context=new InitialContext();
DataSource datasource=(DataSource)context.lookup("datasource");
你可以把它简单地理解为它是一种将对象和名字绑定的技术,对象工厂负责生产出对象,每个对象都和它的唯一的名字绑定,外部程序可以通过名字来获得这些对象的引用。像JDBC中的“DataSource”类就是这样。
命名或目录服务允许可以集中管理共享信息的存储,使用JNDI可以使相关的应用程序更加一致和易于管理。例如,可以将数据源存储在目录服务中,这样所有与数据源相关的应用程序都能够使用它。其实我们每天都在不自知的情况下使用命名服务。例如,当您在浏览器中输入http://www.landingbj.com/ 时,域名系统(Domain Name System ,DNS)将这个以符号表示的URL转换为一个通信标识符(IP地址)。
JNDI综述
目录服务是命名服务的自然扩展。二者的关键区别在于,目录服务允许属性(比如用户的电子邮件地址)与对象相关联,而命名服务则不然。这样,使用目录服务时,您可以基于对象的属性来搜索它们。JNDI允许您访问文件系统中的文件,定位远程RMI注册表中的对象,访问诸如LDAP这样的目录服务,并定位网络上的EJB。
JNDI架构(如下图所示)
JNDI的架构与JDBC的架构非常类似.JNDI架构提供了一组标准命名系统的API,这个基础API是构建在与SPI之上。这个API提供如下五个包
· javax.naming
· javax.naming.directory
· javax.naming.event
· javax.naming.ldap
· javax.naming.spi
在应用程序中,我们实际上只使到用以上几个包的中类.具体调用类及通信过程对用户来说是透明的.JNDI API提供了访问不同JNDI服务的一个标准的统一的实现(最下层为JNDI 服务的具体实现),第一层JNDI API层,中间层为命名管理层。
服务端是由SPI对应的公司/厂商来实现的,我们只需将服务端的相关参数传给JNDI API就可以了,具体调用过程由SPI来完成.
JNDI 服务的具体实现:
l LDAP(Lightweight Directory Access Protocol)服务提供者
l CORBA COS(Common Object Request Broker Architecture Common Object Services)命名服务提供者
l RMI(Java Remote Method Invocation)注册服务提供者
l DNS(Domain Name System)服务提供者.
l FSSP(File System Service Provider)文件系统服务提供者
l 其它服务提供者
示例代码(以FSSP为例):
package org.demo;
import java.util.Properties;
import javax.naming.*;
/**
* 示例代码
*
* @author JUN
*/
public class FileStstemTest {
public static void main(String[] args) {
try {
Properties env = new Properties();
// 制定文件系统服务的提供者
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
// 绑定上下文
env.put(Context.PROVIDER_URL, "file:///c:/");
// 初始化上下文
Context ctx = new InitialContext(env);
// 循环遍历
NamingEnumeration list = ctx.list("/");
while (list.hasMore()) {
NameClassPair nc = (NameClassPair) list.next();
System.out.println(nc);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
$360Section: javax.naming.Context
$Recycle.Bin: javax.naming.Context
360SANDBOX: javax.naming.Context
6d15bb1a234ee2a68937b676ba24: javax.naming.Context
alipay: javax.naming.Context
autoexec.bat: java.io.File
bdkv_install.log: java.io.File
bea: javax.naming.Context
config.sys: java.io.File
Documents and Settings: javax.naming.Context
drivers: javax.naming.Context
e63b0f855d3443cc2b2d3a7c432a29: javax.naming.Context
f9dae541b4d9c591464c: javax.naming.Context
fileSystemService.properties: java.io.File
Foxmail 7.2: javax.naming.Context
hiberfil.sys: java.io.File
hrIntegrity: javax.naming.Context
inetpub: javax.naming.Context
jbossJndi.properties: java.io.File
MSOCache: javax.naming.Context
pagefile.sys: java.io.File
PerfLogs: javax.naming.Context
Program Files: javax.naming.Context
Program Files (x86): javax.naming.Context
ProgramData: javax.naming.Context
Recovery: javax.naming.Context
System Volume Information: javax.naming.Context
temp: javax.naming.Context
Users: javax.naming.Context
Windows: javax.naming.Context
Windows.old: javax.naming.Context
ZZ: javax.naming.Context
注意,使用FSSP需要导入两个jar包
该贴被lijun.fang编辑于2015-3-26 11:27:29该贴被lijun.fang编辑于2015-3-26 11:29:05