1. 什么是 JNDI ( Java Naming and Directory Interface )
JNDI 是用于访问不同命名和目录服务的统一 API 接口;
2. JNDI 的架构和原理
1. 架构:
第一层: java 代码,是访问 JNDI 的代码;
第二层: JNDI API :统一的命名和目录服务接口
第三层: JNDI Naming Manager : JNDI 管理器
第四层: JNDI SPI :用于构建 JNDI 实现的框架,能够动态的插入命名和目录服务提供商的产品;
第五层:命名和目录服务提供商的产品;
命名和目录服务提供商的产品 , 例如: DNS,LDAP,NIS,NDS……..; 因为这些产品都是不同的提供商提供的产品,所以他们的命名和目录服务的标准不一致,各个目录服务采用的访问协议也是不一样的,所以,要是直接访问他们的话,就要编写不同的 java 代码来访问他们;因此, JNDI SPI 就解决了这个问题,它能动态的插入这些命名和目录服务,能够将其协议专属的目录产品集成到系统中,使得我们能只需要调用一个统一的 javaAPI 就能够访问插入的产品了;
2 .原理:
JNDI 其实很好理解,他就是一个树状的结构,它的最顶是一个 initialContext 节点,然后它的下面就是绑定的一些对象或是一些 subContext ,用 JNDI 树就能够查找到树中每一个绑定上的节点上的对象的引用;
3. 怎样连接到 JNDI 上?
Environment environment = new Environment() ;// 创建一个环境对象
environment.setProviderurl(“t3://www.blogjava.net”) ;
environment.setSecurityPrincipal(“todd”) ;// 认证的用户名
environment.setSecurityCredentials(“841026”) ;// 密码
Context context = environment.getInitialContext() ;
// 创建一个 subContext 并绑定一个对象:
Context subContext = context.createSubcontext(“subContext”) ;
subContext.rebind(“newObject”,object) ;// 绑定的对象必须是可序列化的
subContext.close() ;
context.close() ;
4. 如何通过 JNDI 查找 bind 的对象?
Object object = context.lookup(“User”) ;
// 把 user 窄化到原型
User user = (User)javax.rmi.PortableRemoteObject.narrow(object, User.class) ;
context.close() ;
spring与 weblogic jndi集成
虽然 spring本身是可以直接使用 jndi来进行获取一些对象 ,但是在和 weblogic集成的时候往往还是容易出
现问题 (在 web应用的时候出现问题的可能性不大 ,因为 Container已经做了很多事情了 .)但是在 ide或者其
他的应用环境下 (不同的 jvm的时候 ),通常找不到 provider_url等属性造成无法找到 jndi.
修改配置文件如下 :
<!-- 通过 jndi的方式来调用 datasource,即使不一定是在 j2ee环境中也可以正常使用默认情况下,如果
没有指定, "java:comp/env/"将放在后面 jndi名称前面
-->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>jdbc/myDatasource</value>
</property>
<!-- 如果你不想使用 'java:comp/env/'前缀的话请设置下面的值为 true, 默认值为 false -->
<property name="resourceRef">
<value>false</value>
</property>
<property name="jndiEnvironment">
<props>
Spring连接 weblogic-DataSource错误
<!-- The value of Context.PROVIDER_URL -->
<prop key="java.naming.provider.url">t3://localhost:7001</prop>
<prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory
</prop>
</props>
</property>
</bean>
注意在设置的时候由于不在同一个 jvm里面 ,所以一定要设置 provider.url和 factory.initial的属性值 ,否
则会出现 NoInitialContextException的异常出现 .
此外如果和其他的应用服务器集成的话可能不只是要设置上面的两个属性,还要设置相关的其他属性。详
细情况参考: javax.naming.Context类的说明文档。
http://java.sun.com/j2se/1.4.2/docs/api/javax/naming/Context.html
其中设置的:
<property name="jndiEnvironment">
<props>
<!-- The value of Context.PROVIDER_URL -->
<prop key="java.naming.provider.url">t3://localhost:7001</prop>
<prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory
</prop>
</props>
</property> 实际上就是设置 Context初始化的时候设置的 Properties属性。
http://java.mblogger.cn/layout/posts/11849.aspx
=====================================================================
New Document<bean id="zooDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"><value>ZOO_JNDI</value></property>
<property name="jndiEnvironment"> <props>
<prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>
<prop key="java.naming.provider.url">t3://localhost:7001</prop>
<prop key="java.naming.security.principal">weblogic</prop>
<prop key="java.naming.security.credentials">weblogic</prop>
</props>
</property>
</bean>
=====================================================================
各种应用服务器的不同的 properties集合 :
websphere:
java.naming.provider.url->iiop://websphere.machine.domain.com:900
java.naming.factory.initial ->com.ibm.websphere.naming.WsnInitialContextFactory
java.naming.factory.url.pkgs ->com.ibm.ws.naming
org.omg.CORBA.ORBClass->com.ibm.rmi.iiop.ORB
org.omg.CORBA.ORBSingletonClass->com.ibm.rmi.corba.ORBSingleton
javax.rmi.CORBA.UtilClass->com.ibm.rmi.javax.rmi.CORBA.Util
javax.rmi.CORBA.StubClass->com.ibm.rmi.javax.rmi.CORBA.StubDelegateImpl
javax.rmi.CORBA.PortableRemoteObjectClass->com.ibm.rmi.javax.rmi.PortableRemoteObject
weblogic:
java.naming.factory.initial -> weblogic.jndi.WLInitialContextFactory
java.naming.provider.url -> t3://localhost:7001
jboss:
ava.naming.factory.initial ->org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs->org.jboss.naming.client
java.naming.provider.url ->jnp://10.0.0.18:1099
sunone IMQ ldap:
java.naming.provider.url -> ldap://localhost:389/dc=yusong,dc=com
java.naming.factory.initial -> com.sun.jndi.ldap.LdapCtxFactory
sunone Application Server:
java.naming.provider.url -> iiop://192.168.0.34:3700
java.naming.factory.initial -> com.sun.jndi.cosnaming.CNCtxFactory
oracle oc4j:
java.naming.factory.initial->com.evermind.server.ApplicationClientInitialContextFactory
java.naming.provider.url->ormi://localhost/bmpapp
原文地址:http://blog.csdn.net/liuzhenwen/article/details/6003679