JNDI全称 Java Naming and Directory Interface 
JNDI是Java平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。如同其它很多Java技术一样,JDNI是provider-based的技术,暴露了一个API和一个服务供应接口(SPI)。这意味着任何基于名字的技术都能通过JNDI而提供服务,只要JNDI支持这项技术。JNDI目前所支持的技术包括LDAP、CORBA Common Object Service(COS)名字服务、RMI、NDS、DNS、Windows注册表等等。很多J2EE技术,包括EJB都依靠JNDI来组织和定位实体。 
JDNI通过绑定的概念将对象和名称联系起来。在一个文件系统中,文件名被绑定给文件。在DNS中,一个IP地址绑定一个URL。在目录服务中,一个对象名被绑定给一个对象实体。 
JNDI中的一组绑定作为上下文来引用。每个上下文暴露的一组操作是一致的。例如,每个上下文提供了一个查找操作,返回指定名字的相应对象。每个上下文都提供了绑定和撤除绑定名字到某个对象的操作。JNDI使用通用的方式来暴露命名空间,即使用分层上下文以及使用相同命名语法的子上下文。 

解决方案 »

  1.   

    你说:“JNDI中的一组绑定作为上下文来引用。”,
    我想请教你,这句话如何理解?上下文是什么?JNDI绑定与上下文是怎么联系起来的?
    谢谢!
      

  2.   

    那我说说我的理解:
    jndi就是高级一点的对象命名机制,简单分开为命名服务和在此基础上的目录服务。
    命名服务很简单啊,就是给个对象起个名,就像String s = "test String"是用s表示一个字符串一样。
    但jndi的命名服务高级就高级在适用范围上。比如上面的例子里的s被绑定到了一个字符串上,但这个s的适用范围只在于某个方法执行周期(如果s是局部变量)或只在该jvm进程内,其它jvm进程内根本不可能通过s来引用到这个字符串,更不用说在其它机器上了。而jndi的命名服务中绑定的对象可以跨jvm进程甚至跨机器(通过网络)获取到。
    怎么实现的呢?jndi服务,顾名思义就是有服务器和客户端的啦。我们用context.lookup(String name)方法查找到某个对象时,我们就是在利用jndi客户端获取该name对应的对象,而在某背后,肯定是在jndi服务器的啦。这个jndi服务器可能是Sun的LDAP服务器,也可能是Microsoft Active Directory,当然也可能是其它很简单的服务实现^_^
    至于是哪种服务器,则使用该服务时在new InitialContext(Properties props)时指定是哪种服务器以及它在哪里以及可能携带的安全验证等等……
    这种命名服务主要目的当然是用来共享数据啦,有时候可以当数据库用呢^_^
    至于目录服务嘛,还不是很理解,但感觉其实也很简单,就是在用一个名绑定一个对象的基础上引进一个概念:一个对象是有很多属性的,除了name外,也可能有email、phone或size或……,这样扩展出来的就叫目录服务啦^_^
    再至于……上下文之类的,理解成类似于文件系统时的一个个目录就差不多了吧^_^,说得好听而已……呵呵
      

  3.   

    对于“上下文”,应该不至于那么难理解吧?我觉得只是人家把“Context”翻译成“上下文”翻译得太别扭了……我的理解:“上下文”就跟“所处的环境”差不多的意思!而环境是由事物构成的。
    比如EJB里的上下文“EJBContext”,或它的子接口“SessionContext”或“EntityContext”,就是指某个EJB周围的对象和容器所提供的服务所构成的环境。查看一下这些Context接口的定义就会发现,从这些Context里可以get出EJBObject、Home接口、Handle来,以及可以调用到底层提供的安全、事务等服务。
    EJB所处的环境就是由这些对象和服务所构成的。而对于JNDI的Context,也是一个环境,对于某一个Context,你可以get出包含在其中的被绑定到某一个name的value,也可以get出所有包含在其中的name-value,也可以get出其它的一些属性。
    又因为Context还可以包含subcontext,这成了一种嵌套关系,就变得很像文件夹一样。当然,环境由什么构成也就意味着你有什么东西可以利用。呵呵,其实遇到某一个Context的时候,关键在于查看一下它能提供什么信息,你能怎么利用而已……很多地方都谈到Context,但都有一个共同点,就是把一些与特定功能类无直接关系、但又有可能被这些类用到的信息包含在其中。所以从概念上来说,Context不是什么复杂的东西吧?^_^它的作用就在于提供信息,而绝不会是架构的核心组成……