码迷,mamicode.com
首页 > 其他好文 > 详细

JNDI基础概念

时间:2015-08-13 15:52:41      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:java

Java Naming and Directory Interface

Java命名和目录接口

  • Naming Concepts


    命名服务:通过名字让不同的对象进行联系
    当我们发送邮件时,系统就是通过我们提供的邮箱地址去寻找对应的一个系统对象
    技术分享
    Naming的主要功能就是把一个简单的名字映射到一个复杂的对象
    例如:DNS映射
    www.baidu.com ==> 61.135.169.125
    系统文件映射:
    c:\bin\autoexec.bat ==> File Reference
    从上面两个例子中就可以看出命名服务在我们生活中的广泛应用.
  • Names


    命名系统的名称必须遵循相应的系统语法:一个名称代表一个组件,不同的组件进行关联需要使用约定的规则,下图是利用分隔符关联
    技术分享
    unix系统中,路径使用”/”分开,”/”左右代表不同的目录(文件)
    DNS使用”.” 来关联
    Lightweight Directory Access Protocol (LDAP)使用 “,”分割不同的组件,每个组件使用”=”分割名字和值
  • Bindings


    绑定:一个名称与对象的关联
    一个文件名绑定一个文件,一个域名绑定一个ip地址,一个 LDAP名字绑定一个LDAP实体…
  • References and Addresses


    根据命名服务,某些对象不能直接被命名服务存储,也就是说,一个对象的副本不能放置在命名服务中。相反,它们必须被引用存储;也就是说,一个指向对象的指针或引用被放置在命名服务中,一个引用代表有关如何访问对象的信息。通常,它是一个紧凑的表示,可以用来与对象进行通信,而对象本身可能包含更多的状态信息。
  • Context


    一个Context就是一组名字和对象的绑定集合,每一个Context都有自己的命名规则.一个Context提供一个搜索功能从而返回一个绑定对象,Context通常也提供绑定名字~解绑名字~列出绑定名字的功能.一个Context中的对象也可以绑定另外一个Context的对象(称为subcontext),他们具有相同的命名规则.
    技术分享
    Unix中的每个文件目录,都在Unix的Context中,一个文件目录(sub)可以相对另一个文件目录(parent)命名来表示一个子目录,这个bin目录就是usr的subcontext.
  • Naming Systems and Namespaces


    命名系统是一个连接的相同类型的Context集合(它们具有相同的命名规则),并提供一组共同的操作.
    命名系统为其客户提供命名服务,用于执行命名相关操作。通过它自己的接口访问命名服务。
    命名空间是一个命名系统中所有可能的名字的集合。
  • Directory Concepts

    许多命名服务扩展到一个目录服务。目录服务将名称与对象关联,还可以与这些对象的属性关联
    目录服务 =命名服务+对象(目录对象)
    你不仅可以用它的名字查找某个对象,还可以获取对象的属性或基于它的属性搜索对象。
    技术分享
    举一个电话薄的目录服务,一个用户名可以映射到一个人,一个人拥有地址~手机号~邮箱…属性信息,这里人就是一个目录对象,在这个目录对象里面可以存储很多信息(属性),这些信息都可以通过人的名字获取到.
    Directory Object : 目录对象包含许多属性用来描述它自己

    • Attributes
      目录对象可以包含许多属性
    • Directories and Directory Services
      目录是一组连接的目录对象
      目录服务是提供 创建、添加、删除和修改与目录中的对象相关联的属性操作。通过自己的接口访问服务。
    • Search Service
      向目录服务提供名称得到一个目录对象,另外,还有一些目录,例如LDAP是支持搜索感念的,当你去搜索一个目录对象,可以使用一个名字也可以使用一个逻辑表达式来指明目录对象的属性去获取对象.这种搜索称为搜索过滤器.这种风格的搜索有时被称为反向查找或基于内容的搜索。目录服务搜索会返回满足搜索筛选器的对象.
      • Combining Naming and Directory Services
        目录时常安排他们的对象形成一个层次结构,例如LDAP目录中所有的对象都组成一个树形结构,称为目录信息树(directory information tree (DIT)).在这个DIT里面,一个组织对象可能包含组对象也可能包含个人对象,当目录对象被安排在这种方式中时,它们在容器的属性中又可以作为一个Context。
  • JNDI

    Java命名和目录接口?(JNDI)是一个应用程序编程接口(API),提供命名和目录的功能。它被定义为独立于任何特定目录服务的实现,因此任何一个已经部署的目录服务都可以使用一种共同的方式访问。

    • 架构
      JNDI架构包括一个API和服务提供者接口(SPI),Java应用程序使用JNDI API来访问各种命名和目录服务。SPI使各种命名和目录服务暴漏出来,透明化,从而允许Java应用程序使用JNDI API来访问他们的服务。见下图
      技术分享
    • Packaging
      JNDI是包含在Java SE平台。使用JNDI,你必须有JNDI类和一个或多个服务提供者。JDK包括以下命名和目录服务的服务提供商:

      • Lightweight Directory Access Protocol (LDAP) (轻量级目录访问协议)
      • Common Object Request Broker Architecture (CORBA) Common Object Services (COS) name service (公共对象请求代理体系结构)
      • Java Remote Method Invocation (RMI) Registry(java远程方法调用)
      • Domain Name Service (DNS)
        JNDI划分在五个包中:
      • javax.naming
      • javax.naming.directory
      • javax.naming.ldap
      • javax.naming.event
      • Naming Package
        java.naming包含了访问命名服务的类和接口.
    • Context
      java.naming.Context接口是一个提供搜索/绑定/解绑,重命名对象/创建/销毁subcontext的核心接口.
      Lookup:lookup(Name/String):最常用的搜索操作,传入一个你想要搜索的名称,它会返回一个绑定在该名称的一个对象.
      Bindings:listBindings(Name/String)返回一个按照name-to-object绑定的枚举集合,绑定包含了对象名称/对象类名称/对象本身
      List:list(Name/String)和listBinding相似,只不过它返回一个包含对象名称/对象类名称的枚举集合,不包含对象本身.这个list方法有时是一个很有用的操作,当你只想浏览对象的一些信息而不包含对象本身时,它将比listBinding更有效率,代价更低.
      Name:Name是表示一个通用名称的接口,一个拥有零或多个组件的有序序列.命名系统使用此接口来定义遵循其在命名和目录概念中所描述的约定名称
      References:对象以不同的方式存储在命名和目录服务中。一个对象的引用可能是一个非常简洁的表示.JNDI使用Reference类来表示引用,一个引用包含如何构造对象的副本,JNDI会尝试寻找在目录服务中的java对象并将其转化为Reference.这样JNDI客户端就会有一种错觉:任何java对象都可以存储在目录服务中.

    • The Initial Context
      在JNDI中所有的命名和目录操作都是相对于Context.没有绝对的根路径,因此JNDI声明一个InitialContext,它提供一个开始的指针以便于命名和目录的操作,一旦你拥有了一个InitialContext,你将依赖于它寻找其他的Context和对象.
    • Exceptions.
      JNDI定义了一个具有层次结构的异常机制,能够处理命名和目录操作的任何错误.这个异常机制的根是 NamingException.
    • Directory Package
      javax.naming.directory包继承javax.naming包提供了访问目录服务但不包含命名服务的功能。这个包允许应用程序来检索存储在目录中的对象,并使用指定的属性来搜索对象.
    • The Directory Context
      javax.naming.directory.DirContext接口代表一个目录的Context。DirContext通过继承javax.naming.Context也能作为一个命名Context。这意味着任何目录对象还可以提供命名Context。它定义了用于检查和更新目录入口的属性的方法。
      • Attributes
        你用getattributes()方法检索与目录项关联的属性(为你提供的名称)。使用modifyattributes()修改属性。可以添加、替换或删除属性以及属性值。
      • Searches
        DirContext 包含基于目录的搜索方法。最简单和最常见的用法,应用程序提供一组符合指定属性的value给search()方法搜索目标对象。其他重载search()的方法能支持更复杂的搜索过滤。
    • LDAP Package
      javax.naming.ldap覆盖了javax.naming.directory并提供LDAP V3特有的的功能类和接口。事实上,大多数应用程序使用javax.naming.directory包足够找到LDAP,而不需要使用javax.naming.ldap包。此包主要用于那些需要使用”extended” operations, controls, unsolicited notifications.
      • ”Extended” Operation
        除了一些明确的操作,如搜索和修改,LDAP V3(RFC 2251)指定一种方式传递尚未定义的操作在LDAP客户机和服务器之间。这些操作被称为“扩展”操作。“扩展”的操作可以由一个标准组织,如因特网工程任务组(IETF)定义或由供应商。
      • Controls
        LDAP V3允许任何请求或响应未定义的修改器。一个控件发送一个请求是一个请求控件,一个控件发送一个响应是一个响应控件。一个控件可能由一个标准组织定义,如“Internet工程任务组(IETF)或通过一个供应商。请求控件和响应控件不是必须成对存在的,也就是说,不需要为每个请求控件发送一个响应控件,反之亦然。
      • Unsolicited Notifications
        除了客户端和服务器之间的交互的正常请求/响应方式,LDAP V3还提供了不请自来的通知消息—从服务器异步发送到客户端而不需要任何请求。
    • The LDAP Context
      LdapContext接口是一个可进行扩展操作的Context.发送请求控件/接收响应控件.
    • Event Package
      javax.naming.event包含了支持命名和目录服务事件通知的类和接口.

      • Events
        NamingEvent是由一个命名/目录服务生成的事件。事件包含事件类型。例如,有些事件类型能够影响命名空间的事件,例如“对象添加”,而另外一些则不能,比如“对象更改”。
      • Listeners
        NamingListener是一个监听NamingEvent的对象,每一个类型的NamingEvent都有一个NamingListener与其对应.例如,一个NamespaceChangeListener用来监听命名空间更改的事件,一个ObjectChangeListener用来监听对象更改的事件。

      接受时间通知,要求listener必须注册一个 EventContext 或者EventDirContext.一旦注册,当相应的更改发生在命名/目录服务时,该侦听器将接收事件通知.

    • Service Provider Package
      javax.naming.spi包的作用是适配不同的命名和目录服务,任何服务都可以通过JNDI进入应用。

      • Plug-In Architecture
        javax.naming.spi允许不同的实现动态插入,这些实现包括那些 initial context 和contexts .
      • Java Object Support
        javax.naming.spi:可以执行lookup()返回自然和直观的Java对象.例如,如果你从目录中查找打印机名称,那么你可能会希望得到一个可以操作的打印机对象。这种支持是以对象工厂的形式提供的。
        该包还提供了反向操作。那就是 Context.bind()可以接受Java对象并存储对象到底层的命名/目录服务。这种支持是以静态工厂的形式提供的。
      • Multiple Naming Systems (Federation)
        JNDI操作允许应用程序提供名字,跨越多个命名系统。在完成一个操作过程中,一个服务提供者可能需要与另一个服务提供者进行交互.

版权声明:本文为博主原创文章,未经博主允许不得转载。

JNDI基础概念

标签:java

原文地址:http://blog.csdn.net/u010154120/article/details/47416027

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!