JNDI

来源:互联网 发布:甲骨文软件系统公司 编辑:程序博客网 时间:2024/06/10 23:23

JNDI(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性。

JNDI优点

  包含了大量的命名和目录服务,使用通用接口来访问不同种类的服务;
  可以同时连接到多个命名或目录服务上;
  建立起逻辑关联,允许把名称同Java对象或资源关联起来,而不必知道对象或资源的物理ID。
  JNDI程序包:
  javax.naming:命名操作;
  javax.naming.directory:目录操作;
  javax.naming.event:在命名目录服务器中请求事件通知;
  javax.naming.ldap:提供LDAP支持;
  javax.naming.spi:允许动态插入不同实现。
  利用JNDI的命名与服务功能来满足企业级API对命名与服务的访问,诸如EJB、JMS、JDBC 2.0以及IIOP上的RMI通过JNDI来使用CORBA的命名服务。

JNDI用途

  命名或目录服务使用户可以集中存储共有信息,这一点在网络应用中是重要的,因为这使得这样的应用更协调、更容易管理。例如,可以将打印机设置存储在目录服务中,以便被与打印机有关的应用使用。
  我们大家每天都不知不觉地使用了命名服务。命名系统中的对象可以是DNS记录中的名称、应用服务器中的EJB组件(Enterprise JavaBeans Component)、LDAP(Lightweight Directory Access Protocol)中的用户Profile。
  目录服务是命名服务的自然扩展。两者之间的关键差别是目录服务中对象可以有属性(例如,用户有email地址),而命名服务中对象没有属性。因此,在目录服务中,你可以根据属性搜索对象。JNDI允许你访问文件系统中的文件,定位远程RMI注册的对象,访问象LDAP这样的目录服务,定位网络上的EJB组件。
  对于象LDAP 客户端、应用launcher、类浏览器、网络管理实用程序,甚至地址薄这样的应用来说,JNDI是一个很好的选择。
  JNDI可访问的现有的目录及服务有:
  DNS、XNam 、Novell目录服务、LDAP(Lightweight Directory Access Protocol 轻型目录访问协议)、 CORBA对象服务、文件系统、Windows XP/2000/NT/Me/9x的注册表、RMI、DSML v1&v2、NIS

JNDI与JDBC

  JNDI提供了一种统一的方式,可以用在网络上查找和访问服务。通过指定一个资源名称,该名称对应于数据库或命名服务中的一个记录,同时返回数据库连接建立所必须的信息。
  JNDI主要有两部分组成:应用程序编程接口和服务供应商接口。应用程序编程接口提供了Java应用程序访问各种命名和目录服务的功能,服务供应商接口提供了任意一种服务的供应商使用的功能。
  代码示例:
  try{
  Context cntxt = new InitialContext();
  DataSource ds = (DataSource) cntxt.lookup("jdbc/dpt");
  }
  catch(NamingException ne){
  ...
  }

常用的JNDI操作

  void bind(String sName,Object object);――绑定:把名称同对象关联的过程
  void rebind(String sName,Object object);――重新绑定:用来把对象同一个已经存在的名称重新绑定
  void unbind(String sName);――释放:用来把对象从目录中释放出来
  Object lookup(String sName);――查找:返回目录中的一个对象
  void rename(String sOldName,String sNewName);――重命名:用来修改对象名称绑定的名称
  NamingEnumeration listBinding(String sName);――清单:返回绑定在特定上下文中对象的清单列表
  NamingEnumeration list(String sName);
  代码示例:重新得到了名称、类名和绑定对象。
  NamingEnumeration namEnumList = ctxt.listBinding("cntxtName");
  ...
  while ( namEnumList.hasMore() ) {
  Binding bnd = (Binding) namEnumList.next();
  String sObjName = bnd.getName();
  String sClassName = bnd.getClassName();
  SomeObject objLocal = (SomeObject) bnd.getObject();
  }

原创粉丝点击