Java技术回顾之JNDI--JNDI API

JNDI的用途:

1)你可以用jndi来得到object类的属性

Attribute attr =directory.getAttributes(personName).get("email");
String email = (String)attr.get();

2)你可以用jndi来搜索对象
foxes = directory.search("o=Wiz,c=US", "sn=Fox", controls);
查找谁的名字叫Fox在wiz部门的员工?

3)你可以用jndi通过naming/directory服务查询像printers和databases的对象
如:查询 Printer
Printer printer = (Printer)namespace.lookup(printerName);
printer.print(document);


4)你可以用jndi列表出命名空间的特殊级别的内容

NamingEnumeration list = namespace.list("o=Widget, c=US");
while (list.hasMore()) {
NameClassPair entry = (NameClassPair)list.next();
display(entry.getName(), entry.getClassName());
} 

JNDI API包含以下5个package:
javax.naming
javax.naming.directory
javax.naming.event
javax.naming.ldap
javax.naming.spi
其中前面4个package定义了JNDI客户端接口,面向使用命名和目录服务的应用

最后的javax.naming.spi定义了JNDI服务提供者接口(SPI),面向不同的命名和目录服务提供者。  

命名服务主要API javax.naming

1、Context接口和InitialContext类
Context是命名服务的核心接口,提供对象查找,绑定/解除绑定,重命名对象,创建和销毁子上下文等操作。
InitialContext类实现了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)
修改对象名称 
NamingEnumeration<NameClassPair> list(Name name)
NamingEnumeration<NameClassPair> list(String name)
列出上下文中的所有对象名称信息。NameClassPair包含对象名称和对象类名。
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)
销毁子上下文 

2、Name接口

对应于命名服务概念中的对象名称。它的具体实现可能是一个简单的字符串,也可能是一个复杂对象。CompoundName类和CompositeName类均实现了Name接口,分别代表复合名称和混合名称。

3、Binding类
对应于命名服务概念中的绑定。一个Binding包含对象名称,对象的类名称,对象本身。

String getName()
void setName(String name)
获取/设置对象名称 
String getClassName()
setClassName(String name)
获取/设置对象类名
Object getObject()
void setObject(Object obj)
获取/设置对象 

4、Referenceable接口和Reference类
命名服务中对象的存储方式各不相同。有的将对象直接序列化,这时实现标准的Serializable接口接口。有的要将对象存储在命名系统外部,这就要用到Referenceable接口和Reference类了。Reference类包含了怎样构造出一个实际对象的信息,实际对象则需要实现Referenceable接口。
Referenceable主要方法:
Reference getReference() 返回对象的引用。
当将一个实现了Referenceable接口的对象绑定到Context时,实际上通过getReference()得到它的Reference进行绑定。而如何从Reference中创建出Referenceable实例,则由具体的SPI实现,JNDI客户不用关心。  



目录服务主要API javax.naming.directory

1、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)
通过查询过滤条件进行搜索,同时指定了搜索控制。 

2、Attribute接口和Attributes接口
Attribute接口对应于目录服务概念中的属性。Attributes表示属性的集合。

3、SearchResult类和SearchControls类
SearchResult类继承自Binding类,表示DirContext的search操作的结果。SearchControls类用于对搜索操作进行更精细的控制,如指定搜索范围(Scope),时间限制(TimeLimit)和结果数量限制(CountLimit)。

命名和目录服务事件API javax.naming.event

1、EventContext接口和EventDirContext接口
分别表示支持事件通知的上下文,提供了添加和删除事件监听器的操作。

2、NamingEvent类
命名和目录服务产生的事件。包含一个type表示不同的事件类型。

3、NamingListener/NamespaceChangeListener/ObjectChangeListener
NamingListener是处理NamingEvent事件监听器的接口,NamespaceChangeListener和ObjectChangeListener是它的两个子接口,分别定义了各自感兴趣的NamingEvent事件类型的处理方法。





你可能感兴趣的:(Java技术回顾之JNDI--JNDI API)