# JNDI
JNDI(Java Naming and Directory Interface)
是 Java 提供的 Java 命名和目录接口
。通过调用 JNDI
的 API
应用程序可以定位资源和其他程序对象。 JNDI
是 Java EE
的重要部分,需要注意的是它并不只是包含了 DataSource(JDBC 数据源)
, JNDI
可访问的现有的目录及服务有: JDBC
、 LDAP
、 RMI
、 DNS
、 NIS
、 CORBA
。
Naming Service 命名服务:
命名服务将名称和对象进行关联,提供通过名称找到对象的操作,例如:DNS 系统将计算机名和 IP 地址进行关联、文件系统将文件名和文件句柄进行关联等等。
Directory Service 目录服务:
目录服务是命名服务的扩展,除了提供名称和对象的关联,还允许对象具有属性。目录服务中的对象称之为目录对象。目录服务提供创建、添加、删除目录对象以及修改目录对象属性等操作。
Reference 引用:
在一些命名服务系统中,系统并不是直接将对象存储在系统中,而是保持对象的引用。引用包含了如何访问实际对象的信息。
更多 JNDI
相关概念参考: Java 技术回顾之 JNDI:命名和目录服务基本概念
# JNDI 目录服务
访问 JNDI
目录服务时会通过预先设置好环境变量访问对应的服务, 如果创建 JNDI
上下文 ( Context
) 时未指定 环境变量
对象, JNDI
会自动搜索 系统属性(System.getProperty())
、 applet 参数
和 应用程序资源文件(jndi.properties)
。
使用 JNDI
创建目录服务对象代码片段:
// 创建环境变量对象 | |
Hashtable env = new Hashtable(); | |
// 设置 JNDI 初始化工厂类名 | |
env.put(Context.INITIAL_CONTEXT_FACTORY, "类名"); | |
// 设置 JNDI 提供服务的 URL 地址 | |
env.put(Context.PROVIDER_URL, "url"); | |
// 创建 JNDI 目录服务对象 | |
DirContext context = new InitialDirContext(env); |
Context.INITIAL_CONTEXT_FACTORY(初始上下文工厂的环境属性名称)
指的是 JNDI
服务处理的具体类名称,如: DNS
服务可以使用 com.sun.jndi.dns.DnsContextFactory
类来处理, JNDI
上下文工厂类必须实现 javax.naming.spi.InitialContextFactory
接口,通过重写 getInitialContext
方法来创建服务。
javax.naming.spi.InitialContextFactory:
package javax.naming.spi; | |
public interface InitialContextFactory { | |
public Context getInitialContext(Hashtable<?,?> environment) throws NamingException; | |
} |