b java 之JNDI介绍--- SPI机制 & Java.Util.serviceLoader
文章目录
- 一、描述
- 二、API和SPI规范
- 三、教程(3.6 最重要)
- 3.1 Naming and Directory 的概念
- 3.2 JNDI 的总览
- 3.2.1 Naming Package
- 3.2.2 Directory and LDAP Packages
- 3.2.3 (SPI)Event and Service Provider Packages
- 3.3 Software Setup
- 3.4 Naming and Directory Operations
- 3.5 Advanced Topics for LDAP users
- ** 3.6 Accessing Objects in the Directory 最常用的
- 3.7 Features in JDK 5.0 and JDK 6
- 四、 JAVA SPI 机制
一、描述
文档资料见jdk8,JNDI章节
1.1 详细描述
除了使用传统的依赖加载类并执行的方式外。还可以让供应商按照一定目录格式来存放java的类。java在应用时仅需按照名称,就可以加载和执行目录下的类。提供这样功能和规范的工具包就是JNDI。和JNI很不同
原文
Java命名和目录接口(JNDI)为使用Java编程语言编写的应用程序提供命名和目录功能。它被设计为独立于任何特定的命名或目录服务实现。因此,可以以通用方式访问各种服务(新的,新兴的和已经部署的服务)。
JNDI体系结构由一个API(应用程序编程接口)和一个SPI(服务提供商接口)组成。Java应用程序使用此API访问各种命名和目录服务。SPI使透明地插入各种命名和目录服务成为可能,从而允许使用JNDI技术的API的Java应用程序访问其服务。
1.2 简要描述
服务的发现机制,将类按照格式编排。应用可以自动加载使用。
遵循
-
服务接口约定
--服务接口的定义 -
服务实现
、-- 服务接口的实现 -
服务注册
– 配置定义文件 -
服务发现与使用
– 应用发现并自动加载
1.3 术语
API | Application Programming Interface |
SPI | Service Provider Interface |
二、API和SPI规范
JNDI包含以下软件包:
-
javax.naming
包含用于访问命名服务的类和接口。 -
javax.naming.directory
扩展了核心javax.naming包,以提供除命名服务之外的用于访问目录的功能。 -
javax.naming.event
包含用于在命名和目录服务中支持事件通知的类和接口。 -
javax.naming.ldap
包含用于支持LDAPv3扩展操作和控件的类和接口。 -
javax.naming.spi
包含允许各种命名和目录服务提供程序动态插入JNDI下面的类和接口。
三、教程(3.6 最重要)
3.1 Naming and Directory 的概念
概念的总览
3.1.2 Naming的概念
1 命名系统(naming system)的概念
为对象命名,便于定位资源。
eg:
Naming System | 分割符 | Names | 描述 |
---|---|---|---|
UNIX file system | “/” | 形如/usr/hello
|
文件系统 |
DNS | “.” | 形如sales.Wiz.COM | 域名 |
LDAP | “,” and “=” | cn=Rosanna Lee, o=Sun, c=US | 轻量文件表述 Lightweight Directory Access Protocol用字符替代长文件名称 |
2 binding ,References and Addresses
绑定、引用、地址
- 上面描述的
name
和对象的关联叫做绑定。 - 对象被直接存储,比如url网络资源,数据库地址等,可以贮存一个引用
- 地址,就是存储的地址系统。
3 Context
指name包含的内容。
4 命名系统和空间
Naming Systems and Namespaces
- 命名系统是个一系列资源的集合,命名服务按照输入的规则对服务进行解析。
- namespaces是一个隔离机制,子集合
详细描述
命名系统是一组相连的相同类型(它们具有相同的命名约定)的上下文,并提供一组通用操作。
实现DNS的系统是命名系统。使用LDAP进行通信的系统是命名系统。
命名系统向其客户提供命名服务以执行与命名相关的操作。命名服务是通过其自己的界面访问的。DNS提供了一种将计算机名称映射到IP地址的命名服务。LDAP提供了将LDAP名称映射到LDAP条目的命名服务。文件系统提供了将文件名映射到文件和目录的命名服务。
一个命名空间是一组命名系统中所有可能的名字。UNIX文件系统具有一个名称空间,该名称空间由该文件系统中的所有文件名和目录组成。DNS名称空间包含DNS域和条目的名称。LDAP名称空间包含LDAP条目的名称。
3.1.2 目录的概念
目录是一个集合,关于一堆name的集合。
- 定位一个对象,要么靠绝对路径
- 要么靠目录集合,挨个遍历下去
目录服务,一般我们将目录和文件路径混成一个。其实有区分的。目录有自己的目录服务—为
资源集合
的定位提供服务。
3.2 JNDI 的总览
介绍包结构和打包方式。一个编程模型:将API和SPI抽象分理,应用程序操作API,接口提供者提供SPI
详细描述
Java命名和目录接口™(JNDI)是一个应用程序编程接口(API),它为使用Java™编程语言编写的应用程序提供命名和目录功能。它被定义为独立于任何特定的目录服务实现。因此,可以以通用方式访问各种目录(新目录,新目录和已部署目录)。
- 内置四种SPI的支持
- Lightweight Directory Access Protocol (LDAP)
- Common Object Request Broker + Architecture (CORBA) Common Object Services (COS) name service
- Java Remote Method Invocation (RMI) Registry
- Domain Name Service (DNS)
服务列表包结构
3.2.1 Naming Package
包含了操作naming service的接口
1 Context
所述的javax.naming包定义 上下文接口,这是用于查找,结合/解除绑定,重命名对象和创建和销毁子上下文的核心接口。
Lookup
最常用的操作是 lookup()。您提供lookup()要查找的对象的名称,它返回绑定到该名称的对象。
-
Bindings
listBindings()返回名称到对象绑定的枚举。绑定是一个元组,其中包含绑定对象的名称,对象的类的名称以及对象本身。 -
List
list()与 listBindings()相似,除了它返回名称的枚举(包含对象名称和对象类的名称)。list()对于想要发现有关绑定在上下文中的对象的信息但不需要所有实际对象的应用程序(如浏览器)很有用。尽管 listBindings()提供了所有相同的信息,但它可能是昂贵得多的操作。 -
Name
名称是代表通用名称的接口-零个或多个组件的有序序列。命名系统使用此接口来定义遵循其命名惯例的名称,如“ 命名和目录概念”课程中所述。 -
References
对象以不同的方式存储在命名和目录服务中。引用可能是对象的非常紧凑的表示形式。
JNDI定义了 引用类来表示引用。References包含有关如何构造对象副本的信息。JNDI将尝试将从目录中查找到的引用转换为它们所代表的Java对象,以使JNDI客户端错觉目录中存储的是Java对象。
2 The Initial Context
在JNDI中,所有命名和目录操作都是相对于上下文执行的。没有绝对的根源。因此,JNDI定义了 InitialContext,它提供了命名和目录操作的起点。一旦有了初始上下文,就可以使用它来查找其他上下文和对象。
3.2.2 Directory and LDAP Packages
1. javax.naming.directory
在 javax.naming.directory包扩展 的javax.naming包以提供除了命名服务访问目录服务的功能。该程序包允许应用程序检索与目录中存储的对象相关联,并使用指定的属性搜索对象。
Directory Context
目录上下文
- Attributes 3.1.2中目录模型的,atrribute属性集合。可以增删改查
eg: getAttributes()获取所有属性,modifyAttributes() 修改属性集合 - Searches
基于目录的搜索功能
2. javax.naming.ldap
基本上用不上,大多数的用户使用LDAP功能时, javax.naming.directory就可以满足。这个包存在的意义是相当于 javax.naming.directory的扩展,为ldap的高级功能存在。
3.2.3 (SPI)Event and Service Provider Packages
该 javax.naming.spi中的软件包提供由不同的命名/目录服务提供商的开发人员可以开发和挂钩的实现,这样相应的服务是从使用JNDI应用程序访问的手段。
- Plug-In Architecturec插件化,动态可插拔的SPI设计
- java对象查找:输入一个名称,在目录下搜索java对象,提供服务。也支持倒置:应用程序直接去使用,但是spi的开发者要实现
Context.bind()
接口,提供实现的注入。 - 不同命名系统之间的交互。
3.3 Software Setup
描述了设置运行本教程中描述的示例以及任何其他JNDI应用程序所需的环境所涉及的说明和步骤。
是一个C/S模型。
- LDAP SERVICE先启动。—提供namIng和目录服务
- java naming Service 后启动,与LDAP绑定为应用程序提供服务
这样就实现了,naming Service操纵 LDAP下资源的功能。
3.4 Naming and Directory Operations
描述各种命名和目录操作,并通过大量使用JNDI访问命名/目录服务的示例进行演示。
3.3中环境启动后。可以对资源进行操作。这里演示可以进行那些操作。
3.5 Advanced Topics for LDAP users
为LDAP用户的专门课程。它讨论了将JNDI建模为LDAP API,如何执行LDAP身份验证,SSL以及在生产环境中管理连接。
** 3.6 Accessing Objects in the Directory 最常用的
向您展示如何将应用程序与目录集成,以便可以在目录中存储Java对象以及从目录中检索Java对象。如果目录下资源是java对象呢,这里演示读取和序列化java对象
如何使用,可以搜索文档,这里不介绍
3.7 Features in JDK 5.0 and JDK 6
中的功能介绍 JDK 5.0和JDK 6中可用的JNDI和LDAP Service Provider中的功能。
四、 JAVA SPI 机制
前面的描述,更广泛,是java对不同文件系统操作。
针对于java的SPI机制是serviceLoader。提供便捷动态加载类的功能。
- jdbc和日志框架就是利用这个SPI
Java.Util.serviceLoader
https://juejin.im/post/5d2db85d6fb9a07ea7134408
https://www.jianshu.com/p/46b42f7f593c
- 服务接口约定
- 服务实现
- 服务注册
服务注册(实际上向系统登记服务提供者与服务接口之间的映射关系,以便使用方的服务发现):/META-INF/services/目录下创建文件com.corn.javalib.IMyServiceProvider,内容为
:
com.corn.javalib.MyServiceProviderImpl1
com.corn.javalib.MyServiceProviderImpl2
- 服务发现与使用