jndi+SPI和API

来源:互联网 发布:vs 编程入门视频教程 编辑:程序博客网 时间:2024/06/06 19:54
SPI和API
api的意义,其实就是这些提供给你完成某项功能的类、接口或者方法。
而SPI(Service Provider Interface)是指一些提供给你继承、扩展,完成自定义功能的类、接口或者方法。

SPI是一种回调的思想,回调是指我们在使用api时,我们可以向api传入一个类或者方法,api在合适的时间调用类或者方法。
SPI是在一些通用的标准中,为标准的实现产商提供的扩展点。
标准在上层提供API,API内部使用了SPI,当API被客户使用时,会动态得从当前运行的classpath中寻找该SPI的实现,然后使用该SPI的实现来完成API的功能。

SPI的实现方式是:提供实现的实现类打包成Jar文件,这个Jar文件里面必须有META-INF目录,其下又有services目录,其下有一个文本文件,文件名即为SPI接口的全名,文件的内容该jar包中提供的SPI接口的实现类名。

举一个著名的例子:
mysql的驱动包提供了java.sql.Driver这个SPI的实现,实现类是com.mysql.jdbc.Driver,在mysql-connector-java-5.1.6.jar中,我们可以看到有一个META-INF/services目录,目录下有一个文件名为java.sql.Driver的文件,其中的内容是com.mysql.jdbc.Driver。
在运行DriverManager.getDriver并传入参数“com.mysql.jdbc.Driver”时,DriverManager会从mysql-connector-java-5.1.6.jar中找到com.mysql.jdbc.Driver并实例化返回一个com.mysql.jdbc.Driver的实例。


jndi
jndi是Java 命名和目录接口(Java Naming and Directory Interface,JNDI)的简称.
从一开始就一直是 Java 2平台企业版的核心技术之一。在JMS,JMail,JDBC,EJB等技术中,就大量应用的这种技术。
JNDI可访问的现有的目录及服务有:DNS、XNam 、Novell目录服务、LDAP(Lightweight Directory Access Protocol 轻型目录访问协议)、 CORBA对象服务、文件系统、Windows XP/2000/NT/Me/9x的注册表、RMI、DSML v1&v2、NIS。

JNDI的架构与JDBC的架构非常类似.JNDI架构提供了一组标准命名系统的API,这些API在JDK1.3之前是作为一个单独的扩展包
jndi.jar(通过这个地址下载),这个基础API构建在与SPI之上。这个API提供如下五个包
 javax.naming
 javax.naming.directory
 javax.naming.event
 javax.naming.ldap
 javax.naming.spi

 在应用程序中,我们实际上只使到用以上几个包的中类.具体调用类及通信过程对用户来说是透明的.JNDI API提供了访问不同JNDI服务的一个标准的统一的实现,其具体实现可由不同的 ServiceProvider来完成。前面讲的为第一层JNDI API层.最下层为JNDI SPI API及其具体实现。
它包括了几个增强和下面的命名/目录服务提供者:
 LDAP(Lightweight Directory Access Protocol)服务提供者
CORBA COS(Common Object Request Broker Architecture Common Object Services)命名服务提供者
RMI(Java Remote Method Invocation)注册服务提供者
DNS(Domain Name System)服务提供者.
FSSP(File System Service Provider)文件系统服务提供者
其它服务提供者


中间层为命名管理层。其功能应该由JNDI SPI来完成。上层为JNDI API,这个API包在Java 2 SDK1.3及以上的版本中已经包括。
前面讲解的只是作为应用程序客户端的架构实现,其服务端是由SPI对应的公司/厂商来实现的,我们只需将服务端的相关参数传给JNDI
API就可以了,具体调用过程由SPI来完成。

典型的运用场景:数据源

tomcat中配置一个数据源,程序就可以通过java.sql接口去访问数据库,不管底层的数据库是什么类型。



命名服务主要API javax.naming

1、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)
修改对象名称

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包含对象名称,对象的类名称,对象本身。
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客户不用关心。

目录服务主要APIjavax.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, Attributesattrs)
修改对象的属性集合

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类用于对搜索操作进行
0 0
原创粉丝点击