JNDI 的架构和原理

人走茶凉 提交于 2020-01-22 13:22:58
  1. 什么是 JNDI ( Java Naming and Directory Interface )

JNDI 是用于访问不同命名和目录服务的统一 API 接口;

  1. JNDI 的架构和原理

  2. 架构:

第一层: java 代码,是访问 JNDI 的代码;

第二层: JNDI API :统一的命名和目录服务接口

第三层: JNDI Naming Manager : JNDI 管理器

第四层: JNDI SPI :用于构建 JNDI 实现的框架,能够动态的插入命名和目录服务提供商的产品;

第五层:命名和目录服务提供商的产品;

命名和目录服务提供商的产品 , 例如: DNS,LDAP,NIS,NDS………; 因为这些产品都是不同的提供商提供的产品,所以他们的命名和目录服务的标准不一致,各个目录服务采用的访问协议也是不一样的,所以,要是直接访问他们的话,就要编写不同的 java 代码来访问他们;因此, JNDI SPI 就解决了这个问题,它能动态的插入这些命名和目录服务,能够将其协议专属的目录产品集成到系统中,使得我们能只需要调用一个统一的 javaAPI 就能够访问插入的产品了;

2 .原理:

JNDI 其实很好理解,他就是一个树状的结构,它的最顶是一个 initialContext 节点,然后它的下面就是绑定的一些对象或是一些 subContext ,用 JNDI 树就能够查找到树中每一个绑定上的节点上的对象的引用;

  1. 怎样连接到 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() ;

  1. 如何通过 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.

修改配置文件如下 :

jdbc/myDatasource

false

Spring连接 weblogic-DataSource错误

t3://localhost:7001

weblogic.jndi.WLInitialContextFactory

注意在设置的时候由于不在同一个 jvm里面 ,所以一定要设置 provider.url和 factory.initial的属性值 ,否

则会出现 NoInitialContextException的异常出现 .

此外如果和其他的应用服务器集成的话可能不只是要设置上面的两个属性,还要设置相关的其他属性。详

细情况参考: javax.naming.Context类的说明文档。

http://java.sun.com/j2se/1.4.2/docs/api/javax/naming/Context.html

其中设置的:

t3://localhost:7001

weblogic.jndi.WLInitialContextFactory

实际上就是设置 Context初始化的时候设置的 Properties属性。

http://java.mblogger.cn/layout/posts/11849.aspx

=====================================================================

New Document

ZOO_JNDI

weblogic.jndi.WLInitialContextFactory

t3://localhost:7001

weblogic

weblogic

=====================================================================

各种应用服务器的不同的 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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!