一、什么是LDAP

LIGHTWEIGHT DIRECTORY ACCESS Protocol轻量级目录访问协议(目录服务)

java中的Is java中的IDC_java中的Is

类似于这样的树型组织结构,通过LDAP协议连接后像文件夹目录一样

LDAP实现:AD域环境

LDAP默认端口:389

二、JNDI是什么?

Java Naming and Directory Interface Java命名和目录接口(命名服务接口)

用于根据名字找到位置、服务、信息、资源、对象等----KeyValue对

基本操作:

1.发布服务(名字和资源的映射):bind()

2.用名字查找资源:lookup()

为什么要使用JNDI?

一般链接数据库时都是使用jdbc进行连接,但是如果要链接其他数据库时再使用jdbc进行连接的话就需要改动大量代码,但是使用JNDI就可以避免这样的链接问题。

JDBC直接连接数据库的弊端

1.参数变动引发URL修改

2.数据库产品切换,驱动包修改

3.连接池参数的调整

下图是JDBC连接数据库的一个结构图

java中的Is java中的IDC_对象请求代理_02

而利用JNDI连接数据库的结构如下图所示:

java中的Is java中的IDC_目录服务_03

JNDI因为是一个命名服务,它可连接的资源是多种多样的,不是只有JDBC,还可以是LDAP目录服务、RMI远程方法调用、DNS、XNam、Novell目录服务、CORBA对象服务、文件系统、Windows XP/2000/NT/Me/9x的注册表、DSML v1&v2、NIS等

java中的Is java中的IDC_对象请求代理_04

由此观之,LDAP和JNDI的关系

通过JNDI的接口传一个名字就能获得LDAP目录服务里面的存储的数据

三、什么是JNDI注入

1.JNDI动态协议转换

env.put(Context.PROVIDER_URL,"ldap://localhost:7389/dc=example,dc=com");
DirContext ctx = new InitialDirContext(env);
ctx.lookup("rmi://localhost:7389/ou=employees,dc=example,dc=com");

明明env设置的时使用的是ldap协议,但是lookup时却是rmi协议,这就叫动态协议转换。

支持自动转换的协议

协议名称    

协议URL                

Context类

DNS协议

dns://

com.sun.jndi.url.dns.dnsURLContext

RMI协议

rmi://

com.sun.jndi.url.rmi.rmiURLContext

LDAP协议

ldap://

com.sun.jndi.url.ldap.ldapURLContext

LDAP协议

ldaps://

com.sun.jndi.url.ldaps.ldapsURLContextFactory

IIOP对象请求代理协议

iiop://

com.sun.jndi.url.iiop.iiopURLContext

IIOP对象请求代理协议

iiopname://

com.sun.jndi.url.iiopname.iiopnameURLContextFactory

IIOP对象请求代理协议

corbaname://

com.sun.jndi.url.corbaname.corbanameURLContextFactory

2.JNDI命名引用

1.在LDAP里面可以存储一个外部的资源,叫做命名引用,对应Reference类

比如远程HTTP服务的一个.class文件

2.如果JNDI客户端基于LDAP服务,找不到对应的资源,就去指定的地址请求,如果是命名引用,会把这个文件下载到本地

3.如果下载的.class文件包含无参构造函数或静态方法块,加载的时候就会自动执行

四、什么是RMI

RMI即远程方法调用,是允许运行在一个JAVA虚拟机上的对象调用运行在另外一个远程JAVA虚拟机上的对象的方法。