1.简介:
1>JNDI(Java Naming and Directory Interface)Java命名和目录接口,J2EE的核心技术,把命名和目录服务把标识和资源关联起来在内存形成一颗JNDI树(如下图所示)
(其中C代表Context 或者SubContext,O代表Object,其主要作用就是将Object绑定到不同的Context上)
2>产生原因:随着分布式应用的发展,远程访问对象成为常用的方法,通过Socket编程等手段可以实现远程通信,但仍有一定的局限性,JNDI技术用于查找远程或本地对象
3>架构和实现:
JNDI的架构与JDBC架构类似,JNDI提供了一组标准命名系统的API.这些API构建在SPI基础上,这个API提供了如下五个包:
JNDI API提供了访问不同JNDI服务的一个标准的统一实现。-------如上图所示的第一层
JNDI服务的具体实现由不同的ServiceProvicer来完成。------如上图所示的最下层
常用的SPI主要有以下几种:
LDAP(LightWeight Directory Access Protocal)轻量级目录访问协议
CORBA COS(Common Object Request Broker Archieture Common Object Service)公共对象代理体系结构 公共对象服务
RMI(JAVA Romote Method Invocation)远程方法调用
DNS(Domain Name System)域名系统
FSSP(File System Service Provider)文件系统服务提供者
其他服务提供者
服务管理层----中间层,其功能能JNDI SPI来完成
4>JNDI是一种查找服务,用于查找以下内容
a.WEB应用环境变量
b.EJB和它的环境变量
c.通过DataSource的数据库连接池
d.JMS目标和连接工厂
e.其他服务
5>JNDI树:InitialContext是JNDI树所有搜索的起点
6>创建InitialContext的三种方式
a.从服务器端对象连接到JNDI
Context context=new InitialContext();
b.从任何一个地方连接到JNDI(WebLogic)
创建environment对象
webLogic.jndi.Environment environment=new webLogic.jndi.Environment();
填写environment信息
environment.setProviderurl("t3:127.0.0.1:7001");//webLogic的Server地址
environment.setSecurityPricipal("system"); //安全信息
environment.setSecurityCredentials("password");
使用environment对象创建initialContext
Context context=environment.getInitialContext();
Context subContext=context.createSubContext("createSubContext"); //创建SubContext,
subContext.rebind("rebindObject",object); //在subContext绑定object对象
subContext.close(); //访问结束时经常关闭资源
context.close();
c.基于HashTable连接到JNDI
Hashtable<String, String> env=new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "");
env.put(Context.PROVIDER_URL, "");
env.put(Context.SECURITY_PRINCIPAL, "");
env.put(Context.SECURITY_CREDENTIALS, "");
Context context=new InitialContext(env);
d.使用Properties连接到JNDI:Properties env=new Properties();
env.setProperty("java.naming.factory.initial", "");
env.setProperty("java.naming.provider.url", "");
env.setProperty("java.naming.security.principal", "");
env.setProperty("java.naming.security.credentials", "");
Context context=new InitialContext(env);
6>JNDI环境属性:
7>为JNDI设置默认属性:jndi.properties
a.jndi.properties的搜索顺序:
首先是CLASSPATH
其次是$JAVA_HOME/lib
b.jndi.properties的默认示例
使用这些默认值
Context context=new InitialContext();
8>JNDI中查找对象:
a.LookUp()---从JNDI树中查找对象
b.通过lookUp()返回对象必须映射到它们合适的类型
9>远程绑定对象:
绑定到远程命名服务的对象必须是序列化的对象
访问命名服务时,对象采用的是复制机制
10>目录(Directory) 可看作是命名(Naming)的一个扩充,一个目录不仅像命名一样,还提供了对属性的操作