文章目錄
- 一、描述
- 二、API和SPI規範
- 三、教程(3.6 最重要)
- 3.1 Naming and Directory 的概念
- 3.2 JNDI 的總覽
- 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
- 服務發現與使用