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