目录
2.JNDI概览
JNDI(The Java Naming and Directory Interface)是一个应用程序接口,它向使用Java语言编写的应用提供了命名与目录功能。
JNDI被定义为独立于任何特定目录实现,所以可以使用通用的方法访问不同的实现。
架构
JNDI架构由PI与SPI(service provider interface)构成。
java应用使用JNDI应用程序接口访问不同的命名与目录服务。
SPI允许通过透明方式加载不同的命名与目录服务,因此允许Java应用通过JNDI API访问它们的服务。
包
JNDI属于Java SE平台。如果要使用JNDI,必需具有JNDI类与一个或多个服务提供者。
JDK包含的服务提供者:
- Lightweight Directory Access Protocol(LDAP)
- Commom Object Request Broker Architecture(CORBA)Common Object Services(COS)name service
- Java Remote Method Invocation(RMI) Registry
- Domain Name Service(DNS)
JDNI被分为五个包
- javax.naming
- javax.naming.directory
- javax.naming.ldap
- javax.naming.event
- javax.naming.spi
2.1命名包
javax.naming包中包含了用于访问命名服务的类与接口。
Context
javax.naming包定义了Context接口,用于寻找、绑定/接触绑定、重命名对象与创建销毁子上下文。
- Lookup:lookup()用于查找给定名称对应的对象。
- Bindings:listBindings()返回名称与对象绑定的枚举。绑定是一个名称、类、对象的元组。
- List:方法返回对象名称与对象类名的枚举。由于此操作不会返回对象,所以比listBindings()开销小。
- Name:Name是表示一般名称的接口(零个或),命名系统使用此接口定义复合命名规范的名称。
- References:一个reference是一个对象的紧凑表示,JDNI定义Referece类表示引用。
JNDI将在目录中查找到的引用转化为Java对象,这样可以使客户端产生存储在目录中的是java对象的错觉。
初始Context
JNDI之中,所有的命名与目录操作的执行都涉及context。
由于没有绝对根目录,JNDI定义了InitialContext,用于提供命名与目录操作的起始点。
一旦有了一个初始context,那么就可以利用它来查找其他context与对象。
Exceptions
JNDI定义了一个类异常体系,用于表示执行命名与目录操作的期间发生的异常。
此异常体系的根是NamingException。
处理特定异常的程序可以用于捕获异常的对应子类。
2.2目录与LDAP包
目录包
javax.naming.directory包扩展了javax.naming包用于提供访问目录服务的的功能。
这个包使应用可以检索存储在目录中关联的对象,或使用特定的属性搜索对象。
目录context
DirContext接口表示一个目录上下文。DirContext扩展了Context接口,所以目录对象可以提供命名上下文。
DirContext定义了检测更新关联目录条目的属性的方法。
Attributes:
getAttributes()方法检索关联目录条目的属性。modifyAttributes()方法用于添加、替换、移除属性或属性值。
Searches:
通过将属性集合提交给search()方法来检索对象。重载的search()方法可以使用搜索过滤器进行更复杂的搜索。
LDAP包
javax.naming.ldap包括使用LDAP v3特性的类与接口,这些特性还没有被javax.naming.directory所覆盖。
事实上,大多数使用LDAP的JNDI应用使用javax.naming.directory中的操作就足够了。
javax.naming.ldap主要用于需要扩展操作、控制或主动通知的应用。
扩展操作
除了指定意义明确的操作如搜索与修改,LDAP v3指定了一种在客户端与服务端传输未定义操作的方式。
这些操作称为"extended"操作。
扩展操作需要被标准组织或提供商进行定义。
控制
LDAP v3允许请求与响应使用未定义的修饰符进行扩展,这些未定义的修饰符称为控制。
与请求一起发送的控制称之为请求控制,与响应一起发送的控制称之为响应控制。
控制可以被标准组织或提供商定义。
控制控制与响应控制并不需要成对出现。
LdapContext接口表示用于执行扩展操作、发送请求控制、接收响应控制的上下文。
2.3事件与服务提供者包
事件包
javax.naming.event包含的类与接口在命名与目录服务中提供事件通知功能。
Events,NamingEvent表示一个由命名/目录服务产生的事件。这个事件包含一个type域,用于表示事件的类型。
Listener,NamingListener是一个用于监听NamingEvent的对象。每一类事件都有一个对应类型的NamingListener。
为了接收事件,监听器需要注册在EventContext或EventDirContext中。
一旦注册,当对应类型的改变发生在命名/目录服务中,这个监听器将会接收事件通知。
服务提供者包
javax.naming.spi提供了一组应用调用JNDI的公共接口,用于使用不同命名/目录服务提供者的开发者开发的实现。
插入架构
javax.naming.spi允许不同实现动态插入。这些实现包括initial context与可以通过initial context到达的contexts。
java对象支持
java.naming.spi支持Context.lookup()与相关方法的实现返回Java对象。
java.naming.spi支持Context.bind()与相关方法的实现接收Java对象,然后将对象以命名/目录服务接受的形式存储。
多命名系统
JNDI操作允许应用提供跨多命名系统的名称。
完成此操作,一个服务提供者需要与其他服务提供者进行交互。