JNDI(The Java Naming and Directory Interface,Java 命名和目录接口)
是一组在Java 应用中访问命名和目录服务的API。为开发人员提供了查找和访问各种命名和
目录服务的通用、统一的方式。借助于JNDI 提供的接口,能够通过名字定位用户、机器、
网络、对象服务等。
命名服务:就像DNS 一样,通过命名服务器提供服务,大部分的J2EE服务器都含有命名服务器。
目录服务:一种简化的 RDBMS 系统,通过目录具有的属性保存一些简单的信息。
目录服务通过目录服务器实现,比如微软ACTIVE DIRECTORY 等。
JNDI 是java提供的一组接口,不同的应用程序可以有不同的jndi接口的实现。通过对不同的jndi的实现
就可以通过jndi格式的字符串来(定位)访问相应的资源。
和多数java服务一样,SUN对JNDI也只提供接口,使用JNDI只需要用到JNDI接口而不必关心具体实现:
各WEB容器的JNDI实现类是不同的,比如在JBOSS中,JNDI提供类是
org.jnp.interfaces.NamingContextFactory,与tomcat是不同的。
通过配置一个JNDI字符串,让其它程序能够通过这个配置找到并加载该资源。比如spring的依赖注入,
通过bean标签的配置,将一个bean的所在路径,属性等信息标明,其它程序就可以使用这个JNDI来加载
该bean类。
JNDI 与 静态变量的区别:
一个静态变量只能在本地程序中使用,但如果是跨域的跨进程的程序间要访问某一特定的资源就要使用
JNDI 来进行访问。
JNDI主要作用是为分布式开发作服务的,当你需要网络上其它主机给你提供服务时候,可以将该主机的服
务注册成JNDI,之后直接从JNDI处获取服务.
通过JNDI来加载程序交互所需的对象,你无需知道该对象的具体类以及某些属性的值,你就可以获得该对象,并
进行使用。现在一般的公司服务器都是配置好了JNDI,然后给你JNDI名称,你无需知道数据库用户名和密码
(也有可能不想告诉你)。
大部分程序就是通过加载xml文件,将所有的JNDI解析成键值对存储在map中,然后初始化 javax.naming.Context
然后调用 lookup("JNDI KEY NAME") 方法来获得指定的资源。
java.naming.factory.initial 该 key 指向加载资源的类,也就是外部程序会调用该类来加载指定的资源。
该类由资源提供方提供。
一般 web 服务器启动的时候就会将一些参数存到 System.properties 中这样,后面的代码如果要查JNDI,
直接new InitialContext()就可以了
示例:
tomcat server.xml 配置JNDI
<Resource name="jdbc/test" <!-- JNDI数据池名称 --> type="javax.sql.DataSource" <!-- 数据类 --> password="karid" <!-- 密码 --> driverClassName="oracle.jdbc.driver.OracleDriver" <!-- 驱动 --> maxIdle="2" <!-- 最少可用lia --> maxWait="5000" <!-- 最大等待时间 5秒 --> username="karid" <!-- 用户名 --> url="jdbc:oracle:thin:@127.0.0.1:1521:karid" maxActive="4" <!-- 最大可用连接 --> />
web.xml 引用JNDI资源
<description>MySQL Test App</description> <resource-ref> <description>DB Connection</description> <res-ref-name>jdbc/test</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
java 加载初始化JNDI资源
Context initContext = new InitialContext();
if (initContext == null)
System.out.println("无配置环境");
Context envContext = (Context) initContext.lookup("java:/compenv");
ds = (DataSource) envContext.lookup("jdbc/test"); //根据名称取得数据源
示例2:
JNDI
<Context path="/jndi"> <Resource name="bean/MyBeanFactory" auth="Container" type="com.huawei.jndi.bean.MyBean" factory="org.apache.naming.factory.BeanFactory" bar="23"/> </Context>
java
Context initContext = new InitialContext();
Context envCtx = (Context) initContext.lookup("java:comp/env");
MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory");
System.out.println(bean.getBar());