Java命名和目录接口(JNDI)是一个应用程序接口(API),为使用Java语言编写的应用程序提供基础的命名和目录服务。他被定义为独立于其他目录服务实现。因此可以使用同意的方法去访问许多新建的和已经存在的目录。
Architecture(架构)
JNDI架构由一个API和一个服务提供接口(SPI)构成。Java程序可以使用JNDI API去访问各种各样的命名和目录服务。SPI确保各种各样的命名和目录服务透明地插入,因此允许Java应用程序使用JNDI API访问他们的程序。看下面的图:
Packaging(封装)
JNDI被包括在JavaSE平台中。相使用JNDI,你必须有JNDI类和一些服务提供者。
JDK包括以下的命名/目录服务:
- 轻量级目录访问协议(LDAP)
- 通用对象请求代理体系结构(CORBA)公共对象服务(COS)命名服务
- Java远程方法调用(RMI)注册
- 域名服务(DNS)
其他的服务提供者可以下载从JNDI页面或者从其他的提供商
JNDI分为5个包:
Naming Package
javax.naming包包含了访问命名服务的类和接口。
a) Context
Java.naming包中定义了Context接口,一个查找、绑定/解绑、重命名对象、创建和销毁子上下文的核心接口。
Lookup
最常用的操作是lookup()。你提供一个要查找对象的名字给lookup()方法,然后它返回绑定到这个名字上的对象给你。
Bindings
listBindings()返回一个名字到对象绑定的枚举。一个绑定是一个元组(行记录),包括绑定对象的名字,绑定对象的类名和对象自己。
List
list()方法和listBindings()方法很相似,除了它返回的是包含对象的名字和对象的类名的枚举。当你需要浏览上下文中绑定对象的信息,但不需要实际的对象的时候,list()方 法非常有用。尽管listBindings()提供了同样的信息,但是它需要花费更多的操作。
Name
Name是一个描述通用名字的接口—零或者多个组件的有序序列。命名系统使用这个接口定义符合约定的名字。
References
对象被命名和目录服务用不同的方式存储。引用是一个非常紧凑的形式描述对象。
JNDI定义Reference类来描述引用。一个引用包含了构造一个对象副本的信息。JNDI试图将它在目录中找到的引用转换成Java对象以便JNDI客户端有一个错觉,目录中存 储的是Java对象。
b) The Initial Context(初始化上下文)
在JNDI中所有的命名和目录操作执行都相对于上下文。这儿没有绝对的根。因此,JNDI定义一个InitialContext,提供命名和目录操作的始点。一旦你有一个初始化上 下文,你可以使用它查找其他的上下文和对象。
c) Exceptions
JNDI定义了一系列继承的异常类,可以在你执行命名和目录操作的过程中抛出。类继承层次的根异常类是NamingException。处理一个程序感兴趣的特殊异常可以捕 抓相关的子异常类。否则,就捕抓NamingException。
Directory Package
Javax.naming.directory包扩展自javax.naming提供了访问目录服务的基础服务,除了命名服务。这个包允许应用程序检索存储在目录中的相关对象,也可以使用对象的指定属性去搜索。
a) The Directory Context
DirContext接口描述了目录上下文。DirContext也扮演一个命名上下文角色,因为扩展自Context接口。也就是说,目录对象也可以扮演一个命名上下文。它也定义了 检查和更新相关联目录实体的方法。
b) Attributes
你可以使用getAttributes()方法检索相关联目录实体(你提供名字的)的属性。可以使用modifyAttributes()方法修改属性。你可以使用这个操作增加、替换、或者删除属 性。
c) Searches
DirContext包含基于目录查找的方法。最简单和常用的场景是应用程序指定一系列需要匹配的属性值然后提交给search()方法。其他search()重载方法支持更复杂的搜 索过滤。
LDAP Package
Javax.naming.ldap包包含使用LDAP v3(还没有被更一般的javax.naming.directory包转换的)特性的类和接口。事实上,大多数使用JNDI的应用程序将发现javax.naming.directory包中的功能已经充分够用,一点儿也不需要javax.naming.ldap包。这个包最主要的目的是为应用程序提供 “扩展的”操作,
控制或者主动通知。
a) “Extended“Operation(扩展操作)
为了指定良好的操作如:搜索和修改,LDAP v3(RFC2251)指定了还未定义的操作怎样在客户端和服务器之间传输。这些操作叫做扩展操作。一个扩展操作可以被标准化组织定义,例如:国际互联网工程任务组(The Internet Engineering Task Force,简称 IETF)或者一个厂商。
b) Controls(控制)
LDAP v3允许使用还未定义的修饰符增强请求或者响应,叫做控制。一个控制和请求一起发送叫做请求控制,一个控制和一个响应一起发送叫做响应控制。一个控制可 以被可以被标准化组织定义,例如:国际互联网工程任务组(The Internet Engineering Task Force,简称 IETF)或者一个厂商。请求控制和响应控制不一定是成对出现的, 也就是说,不需要为每个请求控制发送响应控制,反之亦然。
c) Unsolicited Notifications(主动通知)
除了正常Intenet客户端和服务器的请求/响应风格之外,LDAP v3提供了主动通知—消息主动以异步的形式发给客户端,不是为了回复客户端的请求。
d) The LDAP Context
LdapContext接口描述了执行扩展操作,发送请求控制和接收响应控制的上下文。怎样使用JNDI这些特性的例子在控制和扩展这节。
Event and Service Provider Packages
Event Package
java.naming.event包包含支持在命名和目录服务中事件通知特性的类和接口。
事件通知的详细描述在Event Notification 章节。
a) Events(事件)
NamingEvent描述了一个命名/目录服务生成的事件。这个事件包含一个type属性标识了事件的类型。例如,事件类型被影响到的命名空间分类为,“添加对象“,”改变 对象“,和其它。
b) Listeners(监听器)
NamingListener是一个用来监听NamingEvent的对象。每一类的事件类型都有与之对应的NamingListener。例如,NamespaceChangeListener描述了对命名空间改 变的事件感兴趣的监听器,ObjectChangeListener描述了对对象改变事件感兴趣的监听器。
为了接收事件通知,监听器必须被注册到一个EventContext 或者EventDirContext。一旦注册,这个监听器将在命名/目录服务发生相关事件的时候收到一个通知。
Service Provider package
javax.naming.spi包提供了一种方法让不同开发者的命名/目录服务实现以一个合适的方法让应用程序使用JNDI访问。
a) Plug-In Architecture(插件架构)
javax.naming.spi允许不同的实现动态的插入。这些实现包括初始化上下文和从上下文获取。
b) Java Object Support
javax.naming.spi支持查找和相关方法的实现直接返回Java对象,这对Java程序员是自然和直观的。例如你使用一个打印机名字查找,并且期望返回一个可以操作的打 印机对象。这个场景被以对象特性的形式被支持。
这个包还提供相反的支持。也就是说Context.bind()和相关方法支持接收一个Java对象并以可访问的形式存储对象在底层的命名/目录服务中。。这个场景被以对象特性 的形式被支持。
c) Multiple Naming Systems(Federation)(多个命名系统)
JNDI操作允许应用程序提供一个跨命名系统的名字。完成这个操作的过程中,一个服务提供者可能需要和另外一个交互,例如传递这个操作到下一个命名系统。这个 包提供了支持不同的供应者配合完成JNDI操作。
详细的服务提供者机制在Java教程文档中。