JNDI是一组API,它通过java语言为应用程序提供命名(naming)和目录(directory)功能。它被定义成独立于任何特定的目录服务实现。因此各种不同的目录服务可以通过通用的方法被访问
Architecture
JNDI由一组API和SPI(service provider interface)组成。java程序通过JNDI API访问各种naming和directory服务。SPI使各种naming和directory服务的实现透明地插件化从而使java程序访问它所提供的服务。
JNDI包包含在jdk1.3及以后的版本中.为使用JNDI,你需要JNDI classes和一个或多个服务提供者(service providers).jdk1.3包含三个service providers:
·LDAP(Lightweight Directory Access Protocol)
·COS(CORBA Common Object Services name service)
·RMI(Java Remote Method Invocation Registry)
其它的service providers可以从这里获得
JNDI被分为以下5个包:
·javax.naming
·javax.naming.directory
·javax.naming.event
·javax.naming.ldap
·javax.naming.spi
/*************************************************************/
naming package
提供用于访问命名服务的类和接口
·Context上下文
用于查询、绑定/反绑定、重命名对象和创建与销毁子上下文(subContext)
·Names名字
在Context接口中每一个命名方法都有2个重载:一个接受Name参数一个接受java.lang.Sting。Name是一个用于表示泛化的"名字"的接口.因此在Context接口中,一个Name参数是代表合成名字的CompositeName的实例,因此你可以用可以横越不同命名空间的名字来命名一个对象.其他类型的Name参数代表复合的名字.接受Name参数的重载对需要操作名字的应用很有用:组合他们,比较组件等等.
java.lang.Sting的名字参数表示一个合成的名字,这个参数对简单的应用程序来说看起来更有用,比如仅读和查询符合的对象
·Binding绑定
listBindings()返回一个代表名字-对象对的bindings的enumeration.每一个binding由Binding类的一个实例来表示
list()类似listBindings(),但它返回的是NameClassPair的enumeration. NameClassPair包含对象的名字和对象的类的名字.list()对于那些浏览性的应用程序很有用--想知道对象所限的上下文内容但并不需要实际的对象.虽然listBindings()提供所有的相同的信息,但是显然它的代价是高昂的.
·References
对象以不用的方式存储在naming和directory服务中.一个服务支持java对象存储也许支持以序列化的形式存储对象,然而另一些naming和directory服务不支持java对象存储.此外对于在目录中的一些对象,java程序只是访问它们的一组应用.这种情况下一个序列化的java对象也许不是一个适当的表示形式.一个reference或许是一个简洁的对象表示方法,尽管它的序列化形式或许包含了更多的状态
JNDI定义Reference来表示reference.一个reference包含了构造一个java对象的信息.JNDI试图从目录中查询出的reference转化成java对象从而使JNDI客户端明白在目录中存储的java对象到底是什么.
·The Initial Context
在JNDI中,所有的naming和directory操作都在相关的上下文环境下被执行.没有绝对根结点.但是JNDI定义了一个初始上下文-- InitialContext,它提供用于naming和directory操作的开始点.一旦你拥有了初始上下文,你可以用它来查询其他的上下文和对象.
·Exceptions
JNDI定义了一系列的exception用于JNDI操作的异常处理.这些层次结构的根结点是 NamingException