標籤:java j2ee jndi
簡介
JNDI(Java Naming and Directory Interface,Java命名和目錄介面)是SUN公司提供的一種標準的Java命名系統介面,JNDI提供統一的用戶端API,通過不同的訪問提供者介面JNDI服務供應介面(SPI)的實現,由管理者將JNDI API映射為特定的命名服務和目錄系統,使得Java應用程式可以和這些命名服務和目錄服務之間進行互動。目錄服務是命名服務的一種自然擴充。兩者之間的關鍵差別是目錄服務中對象不但可以有名稱還可以有屬性(例如,使用者有email地址),而命名服務中對象沒有屬性。
命名服務
命名服務是一種服務,它提供了為給定的資料集建立一個標準名字的能力。它允許把名稱同Java對象或資源關聯起來,而不必指出對象或資源的物理ID。這類似於字典結構(或者是Java的map結構),該結構中鍵映射到值。例如在Internet上的網域名稱服務 (DNS)(domain naming service,DNS)就是提供將網域名稱映射到IP地址的命名服務,在開啟網站時一般都是在瀏覽器中輸入名字,通過DNS找到相應的IP地址,然後開啟。
所有的網際網路通訊都使用TCP、UDP或IP協議。IP地址由4個位元組32位位元字組成,數字和名字相比,對於人來說名字比數字要容易記憶,但對於電腦來講,它更善於處理數字。
其實所有的命名服務都提供DNS這種準系統,即一個系統向命名服務註冊,命名服務提供一個值到另一個值的映射。然後,另外一個系統訪問命名服務就可以取得映射資訊。這種互動關係對分布式企業級應用來講顯得非常重要,在Java中,基本的名字操作包含在Context介面中。
目錄服務
目錄服務是一種特殊類型的資料庫,與SQL Server、Access、Oracle等關聯式資料庫管理系統相反,構造目錄服務的目的是為了處理基於行為的事務,並且使用一種關係資訊模型。目錄服務將命名服務的概念進一步引申為提供具有階層的資訊庫,這一資訊庫除了包含一對一的關係外,還有資訊的階層。對目錄服務而言,這種階層通常用於最佳化搜尋操作,並且也可以按實際情況進行分布或者跨網路複製。
一個目錄服務通常擁有一個名字服務(但是一個名字服務不必具有一個目錄服務)。如電話簿就是一個典型的目錄服務,一般先在電話簿裡找到相關的人名,再找到這個人的電話號碼。
每一種目錄服務都可以儲存有關使用者名稱、使用者密碼、使用者組(如有關存取控制的 資訊)、乙太網路地址、IP地址等資訊。它所支援的資訊和操作會因為所使用的目錄服務的不同而不同。遺憾的是,訪問不同目錄服務的協議也會不同,所以讀者需要瞭解多 種API。
這就是JNDI的起源,就像JDBC一樣,JNDI充當不同名稱和目錄服務的通用API或者說是前端,然後使用不同的後端適配器來串連實際服務。
JNDI是J2EE技術中的一個完整的組件。它支援通過一個單一的方法訪問不同的、新的和已經存在的服務的方法。這種支援允許任何服務提供者執行通過標準服務提供者介面(SPI)協定插入JNDI架構。
作用
JNDI的功能簡單說就是可以簡單的方式去尋找某種資源。 JNDI是一個應用程式設計的API,為開發人員提供了尋找和訪問各種命名和目錄服務的通用、統一的介面,類似JDBC都是構建在抽象層。比如在Tomcat中配置了一個JNDI資料來源,那麼在程式中之需要用Java標準的API就可以尋找到這個資料來源,以後資料來源配置發生變化了,等等,程式都不需要改動,之需要改改JNDI的配置就行。增加了程式的靈活性,也給系統解耦了。
總結
J2EE 規範要求所有 J2EE 容器都要提供 JNDI 規範的實現。JNDI 在 J2EE 中的角色就是“交換器” —— J2EE 組件在已耗用時間接地尋找其他組件、資源或服務的通用機制。在多數情況下,提供 JNDI 供應者的容器可以充當有限的資料存放區,這樣管理員就可以設定應用程式的執行屬性,並讓其他應用程式引用這些屬性(Java 管理擴充(Java Management Extensions,JMX)也可以用作這個目的)。JNDI 在 J2EE 應用程式中的主要角色就是提供間接層,這樣組件就可以發現所需要的資源,而不用瞭解這些間接性。
在 J2EE 中,JNDI 是把 J2EE 應用程式合在一起的粘合劑,JNDI 提供的間接定址允許跨企業交付可伸縮的、功能強大且很靈活的應用程式。這是 J2EE 的承諾,而且經過一些計劃和預先考慮,這個承諾是完全可以實現的。
Java系列之JNDI