JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),是Java平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。如同其它很多Java技术一样,JDNI是provider-based的技术,暴露了一个API和一个服务供应接口(SPI)。这意味着任何基于名字的技术都能通过JNDI而提供服务,只要JNDI支持这项技术。JNDI目前所支持的技术包括LDAP、CORBA Common Object Service(COS)名字服务、RMI、NDS、DNS、Windows注册表等等。很多J2EE技术,包括EJB都依靠JNDI来组织和定位实体。
javax.naming javax.naming.directory javax.naming.event javax.naming.ldap javax.naming.spi 其中前面4个package定义了JNDI客户端接口,面向使用命名和目录服务的应用。最后的javax.naming.spi定义了JNDI服务提供者接口(SPI),面向不同的命名和目录服务提供者。
2)命名服务:javax.Naming ——Context接口和InitialContext类 Context是命名服务的核心接口,提供对象查找,绑定/解除绑定,重命名对象,创建和销毁子上下文等操作。InitialContext类实现了Context接口,是访问命名服务的起始上下文,通过它可查找对象和子上下文。 Context主要方法: 根据名称获取对象: Object lookup(Name name) Object lookup(String name) 绑定名称到对象:void bind(Name name, Object obj) void bind(String name, Object obj) 解除绑定,释放对象: void unbind(Name name) void unbind(String name) 将对象和一个已经存在的名称重新绑定: void rebind(Name name, Object obj) void rebind(String name, Object obj) 修改对象名称: void rename(Name oldName, Name newName) void rename(String oldName, String newName) 列出上下文中的所有对象名称信息。NameClassPair包含对象名称和对象类名: NamingEnumeration<NameClassPair> list(Name name) NamingEnumeration<NameClassPair> list(String name) 列出上下文中的所有绑定: NamingEnumeration<Binding> listBindings(Name name) NamingEnumeration<Binding> listBindings(String name) 创建子上下文: Context createSubcontext(Name name) Context createSubcontext(String name) 销毁子上下文: void destroySubcontext(Name name) void destroySubcontext(String name) ——Name接口 对应于命名服务概念中的对象名称。它的具体实现可能是一个简单的字符串,也可能是一个复杂对象。CompoundName类和CompositeName类均实现了Name接口,分别代表复合名称和混合名称。 ——Binding类 对应于命名服务概念中的绑定。一个Binding包含对象名称,对象的类名称,对象本身。 ——Referenceable接口和Reference类 命名服务中对象的存储方式各不相同。有的将对象直接序列化,这时实现标准的Serializable接口接口。有的要将对象存储在命名系统外部,这就要用到Referenceable接口和Reference类了。Reference类包含了怎样构造出一个实际对象的信息,实际对象则需要实现Referenceable接口。 Referenceable主要方法: 返回对象的引用:Reference getReference() 当将一个实现了Referenceable接口的对象绑定到Context时,实际上通过getReference()得到它的Reference进行绑定。而如何从Reference中创建出Referenceable实例,则由具体的SPI实现,JNDI客户不用关心。
3)目录服务:javax.naming.directory ——DirContext接口和InitialDirContext类 DirContext是目录服务的核心接口,它扩展了Context接口,除了提供了命名服务的各种操作外,还提供了访问和更新目录对象属性的操作,以及Search操作。InitialDirContext类扩展InitialContext类并实现了DirContext接口,是访问目录服务的起始点。 DirContext主要方法: binding/rebing/unbinding等方法与Context类似,区别是各个方法中均添加了Attributes参数,表示绑定的是一个目录对象,其中有对象本身,还有对象的属性集合。这里不再列举。 获取对象的属性集合: Attributes getAttributes(Name name) 修改对象的属性集合: void modifyAttributes(Name name, int mod_op, Attributes attrs) 搜索包含匹配的属性的对象: NamingEnumeration<SearchResult> search(Name name, Attributes matchingAttributes) 通过查询过滤条件进行搜索,同时指定了搜索控制: NamingEnumeration<SearchResult> search(Name name, String filter, SearchControls cons) ——Attribute接口和Attributes接口 Attribute接口对应于目录服务概念中的属性。Attributes表示属性的集合。 ——SearchResult类和SearchControls类 SearchResult类继承自Binding类,表示DirContext的search操作的结果。SearchControls类用于对搜索操作进行更精细的控制,如指定搜索范围(Scope),时间限制(TimeLimit)和结果数量限制(CountLimit)。
4)命名和目录服务事件:javax.naming.event ——EventContext接口和EventDirContext接口 分别表示支持事件通知的上下文,提供了添加和删除事件监听器的操作。 ——NamingEvent类 命名和目录服务产生的事件。包含一个type表示不同的事件类型。 ——NamingListener/NamespaceChangeListener/ObjectChangeListener NamingListener是处理NamingEvent事件监听器的接口,NamespaceChangeListener和ObjectChangeListener是它的两个子接口,分别定义了各自感兴趣的NamingEvent事件类型的处理方法。 |
|