初识JNDI
初識(shí)JNDI
JNDI是J2EE的核心技術(shù)之一,JNDI的功能簡單說就是可以簡單的方式去查找某種資源。比如在Tomcat中配置了一個(gè)JNDI數(shù)據(jù)源,那么在程序中之需要用Java標(biāo)準(zhǔn)的API就可以查找到這個(gè)數(shù)據(jù)源,以后數(shù)據(jù)源配置發(fā)生變化了,等等,程序都不需要改動(dòng),之需要改改JNDI的配置就行。增加了程序的靈活性,也給系統(tǒng)解耦了。
JNDI的非常重要,我們時(shí)不時(shí)都在用它,可是很多程序員對(duì)它都很陌生,包括本人在內(nèi),下面從最根本的概念入手,認(rèn)識(shí)下JNDI,也為以后深入研究JNDI做個(gè)鋪墊。
JNDI的概念不是一兩句話能說清楚的,網(wǎng)上對(duì)JNDI的概念解釋很多,基本上都是對(duì)官方文檔的翻譯的copy。在此也不廢話了,摘抄SUN官方的一些權(quán)威解釋出來,下面來自java.sun.com:
Java命名和目錄接口(Java Naming and Directory Interface ,JNDI)是用于從Java應(yīng)用程序中訪問名稱和目錄服務(wù)的一組API。命名服務(wù)即將名稱與對(duì)象相關(guān)聯(lián),以便能通過相應(yīng)名稱訪問這些對(duì)象。而目錄服務(wù)即其對(duì)象具有屬性及名稱的命名服務(wù)。?
命名或目錄服務(wù)允許您集中管理共享信息的存儲(chǔ),這在網(wǎng)絡(luò)應(yīng)用程序中很重要,因?yàn)樗梢允惯@類應(yīng)用程序更加一致和易于管理。例如,可以將打印機(jī)配置存儲(chǔ)在目錄服務(wù)中,這樣所有與打印機(jī)相關(guān)的應(yīng)用程序都能夠使用它。 JNDI綜述 我們所有人每天都在不自知的情況下使用命名服務(wù)。例如,當(dāng)您在瀏覽器中輸入U(xiǎn)RL http://java.sun.com 時(shí),域名系統(tǒng)(Domain Name System ,DNS)將這個(gè)以符號(hào)表示的URL轉(zhuǎn)換為一個(gè)通信標(biāo)識(shí)符(IP地址)。在命名系統(tǒng)中,對(duì)象的范圍可以從位于DNS記錄中的名稱變動(dòng)到應(yīng)用程序服務(wù)器中的企業(yè)JavaBeans組件(Enterprise JavaBeans Components ,EJBs),還可以到輕量級(jí)目錄訪問協(xié)議(Lightweight Directory Access Protocol ,LDAP)中的用戶配置文件。?
目錄服務(wù)是命名服務(wù)的自然擴(kuò)展。二者的關(guān)鍵區(qū)別在于,目錄服務(wù)允許屬性(比如用戶的電子郵件地址)與對(duì)象相關(guān)聯(lián),而命名服務(wù)則不然。這樣,使用目錄服務(wù)時(shí),您可以基于對(duì)象的屬性來搜索它們。JNDI允許您訪問文件系統(tǒng)中的文件,定位遠(yuǎn)程RMI注冊(cè)表中的對(duì)象,訪問諸如LDAP這樣的目錄服務(wù),并定位網(wǎng)絡(luò)上的EJB。?
很多應(yīng)用程序選擇使用JNDI都可以收到良好的效果,比如LDAP客戶端、應(yīng)用程序啟動(dòng)器、類瀏覽器、網(wǎng)絡(luò)管理實(shí)用工具,或者甚至是地址簿。 JNDI架構(gòu) JNDI架構(gòu)提供了一個(gè)標(biāo)準(zhǔn)的、與命名系統(tǒng)無關(guān)的API,這個(gè)API構(gòu)建在特定于命名系統(tǒng)的驅(qū)動(dòng)程序之上。這一層幫助把應(yīng)用程序和實(shí)際的數(shù)據(jù)源隔離開來,因此無論應(yīng)用程序是訪問LDAP、RMI、DNS還是其他的目錄服務(wù),這都沒有關(guān)系。換句話說,JNDI與任何特定的目錄服務(wù)實(shí)現(xiàn)無關(guān),您可以使用任何目錄,只要您擁有相應(yīng)的服務(wù)提供程序接口(或驅(qū)動(dòng)程序)即可,如圖下圖所示。
注意,關(guān)于JNDI有一點(diǎn)很重要,即它同時(shí)提供應(yīng)用程序編程接口(Application Programming Interface ,API)和服務(wù)提供程序接口(Service Provider Interface ,SPI)。這樣做的實(shí)際意義在于,對(duì)于您的與命名或目錄服務(wù)交互的應(yīng)用程序來說,必須存在用于該服務(wù)的一個(gè)JNDI服務(wù)提供程序,這便是JNDI SPI發(fā)揮作用的舞臺(tái)。一個(gè)服務(wù)提供程序基本上就是一組類,這些類針對(duì)特定的命名和目錄服務(wù)實(shí)現(xiàn)了各種JNDI接口——這與JDBC驅(qū)動(dòng)程序針對(duì)特定的數(shù)據(jù)系統(tǒng)實(shí)現(xiàn)各種JDBC接口極為相似。作為一名應(yīng)用程序開發(fā)人員,您不需要擔(dān)心JNDI SPI.。您只需確保,您為每個(gè)想使用的命名或目錄服務(wù)提供了一個(gè)服務(wù)提供程序。 J2SE和JNDI JNDI被包含在Java 2 SDK 1.3 及其更新版本中。它還可以用作JDK 1.1和1.2的一個(gè)標(biāo)準(zhǔn)擴(kuò)展。 Java 2 SDK 1.4.x的最新版本進(jìn)行了改進(jìn),將以下命名/目錄服務(wù)提供程序包括進(jìn)來:????
輕量級(jí)目錄訪問協(xié)議(Lightweight Directory Access Protocol,LDAP) 服務(wù)提供程序。????
公共對(duì)象請(qǐng)求代理架構(gòu)(Common Object Request Broker Architecture ,CORBA)公共對(duì)象服務(wù)(Common Object Services ,COS)命名服務(wù)提供程序。????
Java遠(yuǎn)程方法調(diào)用( Remote Method Invocation ,RMI)注冊(cè)表服務(wù)提供程序。????
域名系統(tǒng)( Domain Name System ,DNS) 服務(wù)提供程序。 以上對(duì)JNDI概念內(nèi)涵和外延最權(quán)威的解釋,遺憾的是,J2EE的文檔做得太差了,這點(diǎn)應(yīng)該像微軟學(xué)習(xí)學(xué)習(xí)。 JNDI的范例程序也很少,在網(wǎng)上廣泛流傳的是一些與應(yīng)用服務(wù)器結(jié)合的實(shí)例,如在Tomcat、JBoss、WebLogic中配置了JNDI的數(shù)據(jù)源,然后在程序中去發(fā)現(xiàn)使用。這些例子大家都會(huì),沒意思。 能否在沒有應(yīng)用服務(wù)器的程序中使用JNDI技術(shù)呢?經(jīng)過驗(yàn)證,答案是:可以! 下面給個(gè)例子: import?javax.naming.Context;?
import?javax.naming.InitialContext;?
import?javax.naming.NamingException;?
import?java.util.Hashtable;?
public?class?TestFileSystemJNDI {?
????????public?static?void?main(String[] args)?throws?NamingException {?
????????????????Hashtable env =?new?Hashtable();?
????????????????String name =?"F:\\fscontext-1_2-beta3.zip";?
????????????????//文件系統(tǒng)服務(wù)的提供者?
????????????????env.put(Context.INITIAL_CONTEXT_FACTORY,?"com.sun.jndi.fscontext.RefFSContextFactory");?
????????????????Context ctx =?new?InitialContext(env);?
????????????????//通過上下文查找名稱對(duì)應(yīng)的對(duì)象?
????????????????Object obj = ctx.lookup(name);?
????????????????System.out.println("名稱:["?+ name +?"]綁定的對(duì)象是:"?+ obj);?
????????}?
} 運(yùn)行結(jié)果: 名稱:[F:\fscontext-1_2-beta3.zip]綁定的對(duì)象是:F:\fscontext-1_2-beta3.zip?
Process finished with exit code 0?
抓個(gè)圖看看: 注意,JNDI的概念說的明白,你需要有這個(gè)服務(wù),才可以用JNDI API來獲取。 因此還需要安裝文件系統(tǒng)服務(wù)。這個(gè)例子我不用安裝什么服務(wù),下載個(gè)文件服務(wù)包就行了。其中的兩個(gè)jar文件就包中的。 http://java.sun.com/products/jndi/serviceproviders.html JNDI技術(shù)的實(shí)現(xiàn)很復(fù)雜,如果要深入研究,需要花費(fèi)很大的精力,這個(gè)例子也許沒什么價(jià)值,但對(duì)認(rèn)識(shí)JNDI的概念,以及更好的去使用JNDI是很有幫助的。如果要講解JNDI技術(shù),足足夠?qū)懸槐竞窈竦臅? J2EE就是這樣,把接口留給程序員,把細(xì)節(jié)實(shí)現(xiàn)留給提供商。
命名或目錄服務(wù)允許您集中管理共享信息的存儲(chǔ),這在網(wǎng)絡(luò)應(yīng)用程序中很重要,因?yàn)樗梢允惯@類應(yīng)用程序更加一致和易于管理。例如,可以將打印機(jī)配置存儲(chǔ)在目錄服務(wù)中,這樣所有與打印機(jī)相關(guān)的應(yīng)用程序都能夠使用它。 JNDI綜述 我們所有人每天都在不自知的情況下使用命名服務(wù)。例如,當(dāng)您在瀏覽器中輸入U(xiǎn)RL http://java.sun.com 時(shí),域名系統(tǒng)(Domain Name System ,DNS)將這個(gè)以符號(hào)表示的URL轉(zhuǎn)換為一個(gè)通信標(biāo)識(shí)符(IP地址)。在命名系統(tǒng)中,對(duì)象的范圍可以從位于DNS記錄中的名稱變動(dòng)到應(yīng)用程序服務(wù)器中的企業(yè)JavaBeans組件(Enterprise JavaBeans Components ,EJBs),還可以到輕量級(jí)目錄訪問協(xié)議(Lightweight Directory Access Protocol ,LDAP)中的用戶配置文件。?
目錄服務(wù)是命名服務(wù)的自然擴(kuò)展。二者的關(guān)鍵區(qū)別在于,目錄服務(wù)允許屬性(比如用戶的電子郵件地址)與對(duì)象相關(guān)聯(lián),而命名服務(wù)則不然。這樣,使用目錄服務(wù)時(shí),您可以基于對(duì)象的屬性來搜索它們。JNDI允許您訪問文件系統(tǒng)中的文件,定位遠(yuǎn)程RMI注冊(cè)表中的對(duì)象,訪問諸如LDAP這樣的目錄服務(wù),并定位網(wǎng)絡(luò)上的EJB。?
很多應(yīng)用程序選擇使用JNDI都可以收到良好的效果,比如LDAP客戶端、應(yīng)用程序啟動(dòng)器、類瀏覽器、網(wǎng)絡(luò)管理實(shí)用工具,或者甚至是地址簿。 JNDI架構(gòu) JNDI架構(gòu)提供了一個(gè)標(biāo)準(zhǔn)的、與命名系統(tǒng)無關(guān)的API,這個(gè)API構(gòu)建在特定于命名系統(tǒng)的驅(qū)動(dòng)程序之上。這一層幫助把應(yīng)用程序和實(shí)際的數(shù)據(jù)源隔離開來,因此無論應(yīng)用程序是訪問LDAP、RMI、DNS還是其他的目錄服務(wù),這都沒有關(guān)系。換句話說,JNDI與任何特定的目錄服務(wù)實(shí)現(xiàn)無關(guān),您可以使用任何目錄,只要您擁有相應(yīng)的服務(wù)提供程序接口(或驅(qū)動(dòng)程序)即可,如圖下圖所示。
注意,關(guān)于JNDI有一點(diǎn)很重要,即它同時(shí)提供應(yīng)用程序編程接口(Application Programming Interface ,API)和服務(wù)提供程序接口(Service Provider Interface ,SPI)。這樣做的實(shí)際意義在于,對(duì)于您的與命名或目錄服務(wù)交互的應(yīng)用程序來說,必須存在用于該服務(wù)的一個(gè)JNDI服務(wù)提供程序,這便是JNDI SPI發(fā)揮作用的舞臺(tái)。一個(gè)服務(wù)提供程序基本上就是一組類,這些類針對(duì)特定的命名和目錄服務(wù)實(shí)現(xiàn)了各種JNDI接口——這與JDBC驅(qū)動(dòng)程序針對(duì)特定的數(shù)據(jù)系統(tǒng)實(shí)現(xiàn)各種JDBC接口極為相似。作為一名應(yīng)用程序開發(fā)人員,您不需要擔(dān)心JNDI SPI.。您只需確保,您為每個(gè)想使用的命名或目錄服務(wù)提供了一個(gè)服務(wù)提供程序。 J2SE和JNDI JNDI被包含在Java 2 SDK 1.3 及其更新版本中。它還可以用作JDK 1.1和1.2的一個(gè)標(biāo)準(zhǔn)擴(kuò)展。 Java 2 SDK 1.4.x的最新版本進(jìn)行了改進(jìn),將以下命名/目錄服務(wù)提供程序包括進(jìn)來:????
輕量級(jí)目錄訪問協(xié)議(Lightweight Directory Access Protocol,LDAP) 服務(wù)提供程序。????
公共對(duì)象請(qǐng)求代理架構(gòu)(Common Object Request Broker Architecture ,CORBA)公共對(duì)象服務(wù)(Common Object Services ,COS)命名服務(wù)提供程序。????
Java遠(yuǎn)程方法調(diào)用( Remote Method Invocation ,RMI)注冊(cè)表服務(wù)提供程序。????
域名系統(tǒng)( Domain Name System ,DNS) 服務(wù)提供程序。 以上對(duì)JNDI概念內(nèi)涵和外延最權(quán)威的解釋,遺憾的是,J2EE的文檔做得太差了,這點(diǎn)應(yīng)該像微軟學(xué)習(xí)學(xué)習(xí)。 JNDI的范例程序也很少,在網(wǎng)上廣泛流傳的是一些與應(yīng)用服務(wù)器結(jié)合的實(shí)例,如在Tomcat、JBoss、WebLogic中配置了JNDI的數(shù)據(jù)源,然后在程序中去發(fā)現(xiàn)使用。這些例子大家都會(huì),沒意思。 能否在沒有應(yīng)用服務(wù)器的程序中使用JNDI技術(shù)呢?經(jīng)過驗(yàn)證,答案是:可以! 下面給個(gè)例子: import?javax.naming.Context;?
import?javax.naming.InitialContext;?
import?javax.naming.NamingException;?
import?java.util.Hashtable;?
public?class?TestFileSystemJNDI {?
????????public?static?void?main(String[] args)?throws?NamingException {?
????????????????Hashtable env =?new?Hashtable();?
????????????????String name =?"F:\\fscontext-1_2-beta3.zip";?
????????????????//文件系統(tǒng)服務(wù)的提供者?
????????????????env.put(Context.INITIAL_CONTEXT_FACTORY,?"com.sun.jndi.fscontext.RefFSContextFactory");?
????????????????Context ctx =?new?InitialContext(env);?
????????????????//通過上下文查找名稱對(duì)應(yīng)的對(duì)象?
????????????????Object obj = ctx.lookup(name);?
????????????????System.out.println("名稱:["?+ name +?"]綁定的對(duì)象是:"?+ obj);?
????????}?
} 運(yùn)行結(jié)果: 名稱:[F:\fscontext-1_2-beta3.zip]綁定的對(duì)象是:F:\fscontext-1_2-beta3.zip?
Process finished with exit code 0?
抓個(gè)圖看看: 注意,JNDI的概念說的明白,你需要有這個(gè)服務(wù),才可以用JNDI API來獲取。 因此還需要安裝文件系統(tǒng)服務(wù)。這個(gè)例子我不用安裝什么服務(wù),下載個(gè)文件服務(wù)包就行了。其中的兩個(gè)jar文件就包中的。 http://java.sun.com/products/jndi/serviceproviders.html JNDI技術(shù)的實(shí)現(xiàn)很復(fù)雜,如果要深入研究,需要花費(fèi)很大的精力,這個(gè)例子也許沒什么價(jià)值,但對(duì)認(rèn)識(shí)JNDI的概念,以及更好的去使用JNDI是很有幫助的。如果要講解JNDI技術(shù),足足夠?qū)懸槐竞窈竦臅? J2EE就是這樣,把接口留給程序員,把細(xì)節(jié)實(shí)現(xiàn)留給提供商。
總結(jié)
- 上一篇: Linux Shell编程第四篇case
- 下一篇: seconds_behind_maste