| 小浦熱線 1 將接口分為Context 和 DirContext JNDI有兩個核心接口Context和DirContext,Context中包含了基本的名字操作,而DirContext則將這些操作擴展到目錄服務(wù)。將這些操作分為兩個包一方面為了模塊化,另一方面也可以使服務(wù)減少不必要的開銷。名字是計算服務(wù)中的一個基本功能,使用基本的名字服務(wù)就可以獲得文件系統(tǒng)、電子表格、日歷服務(wù)等功能;DirContext 對Context進行了擴展,提供了基本的目錄服務(wù)操作,對名字對象屬性的維護、基于屬性的名字查找等等。 2 將JNDI 分成多個功能包 JNDI 分為兩個客戶端包(javax.naming,javax.naming.directory) 和一個服務(wù)端包 (javax.naming.spi)。這樣做也同樣是為了減少應(yīng)用程序不必要的開銷,使得應(yīng)用程序只需要包括所必須的包。 3 將客戶端API 和 服務(wù)端的API 分開 JNDI 將客戶端接口與服務(wù)提供商需要的接口分開為不同的包。比如,客戶端程序只需要使用javax.naming包中提供的類,而服務(wù)提供商可能需要javax.naming和javax.naming.spi兩中包。這樣分開可以使客戶和服務(wù)器端只專注于與自身有關(guān)的類信息。 4 上下文列表的多種方法 一般來說有兩種進行上下文列表的應(yīng)用:上下文瀏覽應(yīng)用和對上下文中的對象進行實際操作的應(yīng)用。 上下文瀏覽應(yīng)用一般只需要顯示上下文中包含內(nèi)容的名字,或者再獲取一些諸如對象的類型之類的信息。這種類型的應(yīng)用一般都是交互式的,可以允許用戶在列舉的上下文列表中選擇一些進行進一步的顯示。 另外有一些應(yīng)用需要對上下文中的對象進行實際的操作,比如,一個備份程序需要對目錄中所有文件的狀態(tài)進行操作,或者某打印機管理員可能需要對大樓中的所有打印機進行復(fù)位。為了進行這樣的操作,程序需要獲取上下文中的實際對象。 對于這樣兩種類型的應(yīng)用,Context接口提供了兩種上下文列表方法list()和listBindings()。其中l(wèi)ist()只返回一系列名字/類映射,而listBindings() 則返回名字、類和對象本身。顯然list()用于上下文瀏覽應(yīng)用而listBindings()用于那些需要對對象進行實際操作的應(yīng)用。 5 對聯(lián)合的支持 聯(lián)合是JNDI的一個基本概念,在客戶端接口中可以支持跨越多個名字空間的名字,調(diào)用名字接口的程序不需要知道細(xì)節(jié)問題,只需要指定有關(guān)的名字,有關(guān)在幾個名字系統(tǒng)中如何解析復(fù)合名字的問題留給服務(wù)提供商來解決,與客戶無關(guān)。 6 DirContext 與 DirObject 對于目錄服務(wù)的實現(xiàn)來說,如果不用擴展Context的DirContext接口,也可以使用一個單獨的包含了所有目錄相關(guān)方法的接口如DirObject,這樣的話如果應(yīng)用只使用目錄服務(wù)就可以只包括DirObject,而如果名字服務(wù)和目錄服務(wù)都使用,則可以包括Context和DirObject。這樣當(dāng)然條理比較清晰,但是對于某些混合操作,比如一些對目錄和名字都有效的操作就不太方便了,所以JNDI采用了DirContext而不是DirObject。 7 Schema的支持 DirContext接口包含對schema的支持,例如,客戶可以通過DirContext對象獲得指向該DirContext實例的schema的定義空間的schema對象,或者獲取該schema對象的類定義。Attribute類還更進一步地支持獲取屬性類型信息、屬性定義等的方法。服務(wù)提供商既可以動態(tài)地返回這些schema信息,也可以靜態(tài)地事先準(zhǔn)備好有關(guān)的schema信息。 8 Context 和 DirContext 接口中的方法重載 在Context和DirContext接口中的每個接受Name參數(shù)的方法都有一個接受字符串參數(shù)的同名方法。 設(shè)計以字符串為參數(shù)的方法的原因是由于有很多應(yīng)用只通過對象的名字來訪問這些對象,對于這些應(yīng)用來說,直接使用名字來訪問這些方法當(dāng)然是最直觀的。 而設(shè)計以Name類對象為參數(shù)的方法的動機,也是由于有不少對名字進行維護的應(yīng)用并不關(guān)系名字的字面表達(dá),所以需要以Name對象作為參數(shù)。 在JNDI中這兩種形式的方法都可以調(diào)用,以方便各種不同的應(yīng)用。 9 引用 JNDI包容了多種使用目錄來定位對象的方法,例如,一些應(yīng)用直接將對象自身綁定在目錄中;一些應(yīng)用可能動態(tài)地產(chǎn)生目錄樹,當(dāng)應(yīng)用退出時就刪去該樹;另外一些應(yīng)用可能只是將指向?qū)ο蟮腢RL存貯在名字空間里;還有一些系統(tǒng)可能將一些引用信息綁定到樹中,當(dāng)使用時再用這些信息來訪問實際的對象。 針對這些不同的方式,JNDI定義了一個Reference類來為應(yīng)用信息的表達(dá)提供一種統(tǒng)一的方式。Reference類包含了諸如地址、類型信息等用于訪問具體對象的信息。為了能將對象的引用綁定到目錄樹中,該對象的類必須實現(xiàn)Referenceable接口,其中包含了方法 getReference() 。 Serializable接口與Referenceable接口有頗多相似之處,不同在于可引用的對象只包含一些用于創(chuàng)建實際對象的信息而Serializable會包含更多的甚至不適合存儲在目錄結(jié)構(gòu)中的信息。 10 引用到實際對象的自動定位 對于作為引用綁定在目錄樹中的對象,JNDI SPI 指定針對引用創(chuàng)建實際的對象。因此,在程序中只需要認(rèn)為用lookup()方法返回的對象就是實際對象,而不用在調(diào)用什么方法來將引用轉(zhuǎn)換為實際對象了,所有的工作都由JNDI內(nèi)部完成了。 | 
|  |