JNDI技术个人总结

10 篇文章 0 订阅

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值