命名和目录接口 JNDI-The Java Naming and Directory Interface
命名和目录接口 JNDI-The Java Naming and Directory Interface
JNDI (The Java Naming and Directory Interface)为应用程序提供命名和目录功能。
JNDI体系结构由API和SPI组成。Java应用程序使用JNDI API来访问各种命名和目录服务。SPI允许透明地插入各种命名和目录服务,这样是用来JNDI API的应用程序才能访问JNDI服务。
SPI: Service Provider Interface,服务提供者接口
通俗地讲,你可以通过JNDI给某个对象命名,然后通过这个命名你可以获取到这个对象。就好像DOTA这款经典对战游戏中一位我们熟悉的英雄叫做斯奎、斯布林和斯布恩
,这是一个由三个小地精组成的炸弹小分队,玩家们对于这个名字气急败坏,实在记不住,于是命名为炸弹人
,然后我们通过炸弹人
也能顺利找到这个英雄,当然你只能在DOTA游戏中找到炸弹人
,后面会讲到,DOTA游戏就是所谓的Context
上下文。最后,希望这个例子不要误导了大家对JNDI的认识,它绝对不是一个为了起绰号、假名alias
而存在的标准。
这种命名和目录服务有什么用处?
先说目录服务,有了目录,你就可以在运行时,间接地去查找其他组件、资源或服务,JNDI为这些功能指定了一个通用机制。命名就是组件目录的过程。JNDI主要运用在J2EE中,承担了“交换机”的角色,是J2EE规范中较为重要的规范之一。
JNDI
JNDI本身不是服务,它和JDBC一样,是一组接口,允许应用程序使用标准化API访问许多不同的目录服务提供者。
例如硬件上的Micro接口、TypeC接口或者是USB接口,这些硬件接口只是一种标准和协议,华为、小米各类手机厂商都实现了Micro或者TypeC接口,各类电脑主板厂商例如华硕、华擎、技嘉都在其主板上实现了USB接口。我们真正使用的并不是上述硬件接口协议,而是各个厂家提供的产品,软件领域中,我们称为接口的实现。
正如Spring cache在早期的版本中默认了一个ehcache的实现一样,JDK中也包含了一些自带的目录服务提供程序。
JDK中包含了JNDI,如果要使用JNDI,必须具有一个JNDI的类和对应的服务提供者。
JDK中已经包含的命名/目录服务的提供者有:
- Lightweight Directory Access Protocol (LDAP,轻量级目录访问协议)
- Common Object Request Broker Architecture (CORBA,公共对象请求代理体系结构) Common Object Services (COS,公共对象服务) name service
- Java Remote Method Invocation (RMI,Java远程方法调用) Registry
- Domain Name Service (DNS,域名服务)
JDK中JNDI相关的package
- javax.naming
- javax.naming.directory
- javax.naming.ldap
- javax.naming.event
- javax.naming.spi
javax.naming
javax.naming
包含了进入命名服务的类和接口。
可以参考 JDK的API。
其中比较核心的类是Context
和InitialContext
。
Context
接口是查找,绑定/解除绑定,重命名对象以及创建和销毁子上下文的核心接口。在JNDI中,所有命名和目录操作都是相对于上下文执行的。没有绝对的根源。因此,JNDI定义了一个
InitialContext
,它为命名和目录操作提供了一个起点。获得初始上下文后,可以使用它来查找其他上下文和对象。
Context
lookup
lookup()
是最常用的操作。传入要查找的对象的名称,返回绑定到该名称的对象。
listBindings
listBinding()
返回名称到对象(name-to-object)绑定的枚举。这个枚举包含了绑定对象的名称,对象类的名称和对象本身。
list
list()
与listBinding()
类似,只是不返回对象本身,是一个更轻量地方法。
Name
interface Name
是一个表示0或多个有序序列组件的通用名称的接口。命名系统使用此接口来定义遵循其约定的名称。
References
对象以各种方式存储在命名和目录服务中。一般情况下我们不会存储对象本身,而是存入对象的引用。
JNDI定义Reference类来表示引用。引用包含有关如何构造对象副本的信息。 JNDI从目录中查找到引用,然后转换为它们所指向的Java对象,以便JNDI客户端从目录中获取到的内容是Java对象。
javax.naming.spi
其他的包可以参考JDK API文档中具体的描述,或者在Oracle的官网上获取信息,点击查看。
javax.naming.spi
包为不同命名/目录服务供应商的开发人员提供了可以开发和连接其实现的方法,以便使用JNDI的应用程序可以访问相应的服务。
- Plug-In Architecture
- javax.naming.spi包允许动态插入不同的实现。这些实现包括初始上下文和可以从初始上下文到达的上下文的实现。
- 支持Java对象
- javax.naming.spi包提供了
lookup
和相关方法的实现,以返回Java对象。例如,如果从目录中查找打印机名称,那么您可能希望找回要在其上运行的打印机对象。这种支持以对象工厂的形式提供。该软件包还支持反向操作。也就是说,Context.bind()
和相关方法的实现可以接收Java对象并以底层命名/目录服务可接受的格式存储对象。这种支持以StateFactory
的形式提供(下面引用了JDK API中的描述)。
StateFactory接口表示一个工厂,该工厂用来获得用于绑定的对象状态。
JNDI 框架允许通过对象工厂 动态加载对象实现。例如,当查找绑定在名称空间中的打印机时,如果打印服务将打印机的名称绑定到 Reference,则可以使用该打印机 Reference 创建一个打印机对象,从而查找的调用者可以在查找后直接在该打印机对象上操作。
ObjectFactory 负责创建特定类型的对象。在上述示例中,可以有一个用来创建 Printer 对象的 PrinterObjectFactory。
对于相反过程,当将对象绑定到名称空间中时,JNDI 将提供状态工厂。继续打印机的示例,假设打印机对象被更新和重新绑定:
ctx.rebind("inky", printer);
用于 ctx 的服务提供者使用一个状态工厂来获得绑定到其名称空间的 printer 的状态。用于 Printer 类型对象的状态工厂可能返回一个用来存储在命名系统中的更紧凑的对象。
状态工厂必须实现 StateFactory 接口。此外,工厂类必须是公共的,必须有一个不接受任何参数的公共构造方法。
可以使用不同的参数多次调用状态工厂的 getStateToBind() 方法。该实现是线程安全的。
StateFactory 与只实现 Context 接口的服务提供者一起使用。DirStateFactory 与实现 DirContext 接口的服务提供者一起使用。 - javax.naming.spi包提供了
- Multiple Naming Systems (Federation)
- JNDI操作允许应用程序提供跨多个命名系统的名称。在完成操作的过程中,一个服务提供者可能需要与另一个服务提供者交互,例如传递要在下一个命名系统中继续的操作。该软件包支持不同的提供商合作完成JNDI操作。
其他文章
之后会更新该文章的译文
J2EE or J2SE? JNDI works with both
本文参考文献:
Java API
https://docs.oracle.com/javase/tutorial/jndi/overview/index.html
命名和目录接口 JNDI-The Java Naming and Directory Interface的更多相关文章
- JNDI(Java Naming and Directory Interface)
# 前言 内容基本拷贝,整理出来,方便以后回忆. # What The Java Naming and Directory Interface™ (JNDI) is an application pr ...
- J2EE学习从菜鸟变大鸟之四 JNDI(Java Naming and Directory Interface)
掌握 J2EE 是件不是很轻松的事哈,但是很有意思,抽象抽象哈哈,因为它包含的技术和缩略语在不断地增长.Java 命名和目录接口(Java Naming and Directory Interface ...
- spring配置JNDI(Java Naming and Directory Interface,Java命名和目录接口)数据源
1.在tomcat下的server.xml的 <GlobalNamingResources> </GlobalNamingResources>添加下面代码 <Resour ...
- 【JNDI】Java Naming and Directory Interface
一.数据源的由来 在Java开发中,使用JDBC操作数据库的四个步骤如下: ①加载数据库驱动程序(Class.forName("数据库驱动类");) ②连接数据库(Conn ...
- Java Naming and Directory Interface (JNDI) Java 命名和目录接口
https://www.oracle.com/technetwork/java/jndi/index.html Lesson: Overview of JNDI (The Java™ Tutorial ...
- JNDI(Java Naming and Directory Interface,Java命名和目录接口)
JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访 ...
- Java命名和目录接口——JNDI
JNDI即Java命名和目录接口(JavaNaming and Directory Interface),它属于J2EE规范范畴,是J2EE的核心技术之一,提供了一组接口.类和关于命名空间的概念.JD ...
- JNDI Java 命名与目录接口
jsp <% Context ctx = new InitialContext(); String jndiName = (String) ctx.lookup("java:comp/ ...
- JNDI--Java命名和目录接口
JNDI主要用于在容器中配置某些资源,让所有项目可以使用.JNDI可以提供: 1:数据库连接池. 自定义连接池 第三方连接池 Dbcp ...
随机推荐
- 在kubernetes集群中创建redis主从多实例
分类 > 正文 在kubernetes集群中创建redis主从多实例 redis-slave镜像制作 redis-master镜像制作 创建kube的配置文件yaml 继续使用上次实验环境 ht ...
- webpack插件自动加css3前缀
想要webpack帮忙自动加上“-webkit-”之类的css前缀,我们需要用到postcss-loader和它的插件autoprefixer 1.安装 npm i postcss-loader au ...
- JavaScript基本数据类型介绍
JavaScript基本数据类型介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是javascript JavaScript一种直译式脚本语言,是一种动态类型.弱类型. ...
- bzoj千题计划205:bzoj3529: [Sdoi2014]数表
http://www.lydsy.com/JudgeOnline/problem.php?id=3529 有一张n*m的数表,其第i行第j列(1 < =i < =n,1 < =j & ...
- 40个新鲜的 jQuery 插件,使您的网站用户友好
作为最流行的 JavaScript 开发框架,jQuery 在现在的 Web 开发项目中扮演着重要角色,它简化了 HTML 文档遍历,事件处理,动画以及 Ajax 交互,这篇文章特别收集了40个新鲜的 ...
- [转载]TypeScript 入门指南
之前有听过,但未使用过,而最近在用nodejs,angularjs做一些前端项目,想到了这个来,正是学习TypeScript的时候,看介绍貌似和coffeescript相似,也JavaScript的转 ...
- 使用渐进式JPEG来提升用户体验
今天才认识到原来JPEG文件有两种保存方式他们分别是Baseline JPEG(标准型)和Progressive JPEG(渐进式).两种格式有相同尺寸以及图像数据,他们的扩展名也是相同的,唯一的区别 ...
- JavaScript 计时
http://www.w3school.com.cn/js/js_timing.asp JavaScript 计时事件 通过使用 JavaScript,我们有能力作到在一个设定的时间间隔之后来执行代码 ...
- JS异常简单处理
有时候JS某一处报错会导致整个页面JS的运行出问题,于是想的简单研究一下JS的错误处理机制.更详细的可以自己参考网站研究: https://developer.mozilla.org/zh-CN/ ...
- Quartus II 安装教程—FPGA入门教程【钛白Logic】
Quartus II 工具安装一般分为两个部分,首先是开发工具本身的安装,其次就是器件库的安装,我们可以根据我们的需要选择相应的器件库来安装,这里我们使用Cyclone IV的FPGA,即安装Cycl ...