文章出處
文章列表
原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://lavasoft.blog.51cto.com/62575/191633
初識JNDI
JNDI是J2EE的核心技術之一,JNDI的功能簡單說就是可以簡單的方式去查找某種資源。比如在Tomcat中配置了一個JNDI數據源, 那么在程序中之需要用Java標準的API就可以查找到這個數據源,以后數據源配置發生變化了,等等,程序都不需要改動,之需要改改JNDI的配置就行。 增加了程序的靈活性,也給系統解耦了。
JNDI的非常重要,我們時不時都在用它,可是很多程序員對它都很陌生,包括本人在內,下面從最根本的概念入手,認識下JNDI,也為以后深入研究JNDI做個鋪墊。
JNDI的概念不是一兩句話能說清楚的,網上對JNDI的概念解釋很多,基本上都是對官方文檔的翻譯的copy。在此也不廢話了,摘抄SUN官方的一些權威解釋出來,下面來自java.sun.com:
Java 命名和目錄接口(Java Naming and Directory Interface ,JNDI)是用于從Java應用程序中訪問名稱和目錄服務的一組API。命名服務即將名稱與對象相關聯,以便能通過相應名稱訪問這些對象。而目錄服務即 其對象具有屬性及名稱的命名服務。
命名或目錄服務允許您集中管理共享信息的存儲,這在網絡應用程序中很重要,因為它可以使這類應用程序更加一致和易于管理。例如,可以將打印機配置存儲在目錄服務中,這樣所有與打印機相關的應用程序都能夠使用它。
命名或目錄服務允許您集中管理共享信息的存儲,這在網絡應用程序中很重要,因為它可以使這類應用程序更加一致和易于管理。例如,可以將打印機配置存儲在目錄服務中,這樣所有與打印機相關的應用程序都能夠使用它。
JNDI綜述
我
們所有人每天都在不自知的情況下使用命名服務。例如,當您在瀏覽器中輸入URL http://java.sun.com 時,域名系統(Domain
Name System
,DNS)將這個以符號表示的URL轉換為一個通信標識符(IP地址)。在命名系統中,對象的范圍可以從位于DNS記錄中的名稱變動到應用程序服務器中的
企業JavaBeans組件(Enterprise JavaBeans Components
,EJBs),還可以到輕量級目錄訪問協議(Lightweight Directory Access Protocol
,LDAP)中的用戶配置文件。
目錄服務是命名服務的自然擴展。二者的關鍵區別在于,目錄服務允許屬性(比如用戶的電子郵件地址)與對 象相關聯,而命名服務則不然。這樣,使用目錄服務時,您可以基于對象的屬性來搜索它們。JNDI允許您訪問文件系統中的文件,定位遠程RMI注冊表中的對 象,訪問諸如LDAP這樣的目錄服務,并定位網絡上的EJB。
很多應用程序選擇使用JNDI都可以收到良好的效果,比如LDAP客戶端、應用程序啟動器、類瀏覽器、網絡管理實用工具,或者甚至是地址簿。
目錄服務是命名服務的自然擴展。二者的關鍵區別在于,目錄服務允許屬性(比如用戶的電子郵件地址)與對 象相關聯,而命名服務則不然。這樣,使用目錄服務時,您可以基于對象的屬性來搜索它們。JNDI允許您訪問文件系統中的文件,定位遠程RMI注冊表中的對 象,訪問諸如LDAP這樣的目錄服務,并定位網絡上的EJB。
很多應用程序選擇使用JNDI都可以收到良好的效果,比如LDAP客戶端、應用程序啟動器、類瀏覽器、網絡管理實用工具,或者甚至是地址簿。
JNDI架構
注
意,關于JNDI有一點很重要,即它同時提供應用程序編程接口(Application Programming Interface
,API)和服務提供程序接口(Service Provider Interface
,SPI)。這樣做的實際意義在于,對于您的與命名或目錄服務交互的應用程序來說,必須存在用于該服務的一個JNDI服務提供程序,這便是JNDI
SPI發揮作用的舞臺。一個服務提供程序基本上就是一組類,這些類針對特定的命名和目錄服務實現了各種JNDI接口——這與JDBC驅動程序針對特定的數
據系統實現各種JDBC接口極為相似。作為一名應用程序開發人員,您不需要擔心JNDI
SPI.。您只需確保,您為每個想使用的命名或目錄服務提供了一個服務提供程序。
J2SE和JNDI
JNDI被包含在Java 2 SDK 1.3 及其更新版本中。它還可以用作JDK 1.1和1.2的一個標準擴展。 Java 2 SDK 1.4.x的最新版本進行了改進,將以下命名/目錄服務提供程序包括進來:
輕量級目錄訪問協議(Lightweight Directory Access Protocol,LDAP) 服務提供程序。
公共對象請求代理架構(Common Object Request Broker Architecture ,CORBA)公共對象服務(Common Object Services ,COS)命名服務提供程序。
Java遠程方法調用( Remote Method Invocation ,RMI)注冊表服務提供程序。
域名系統( Domain Name System ,DNS) 服務提供程序。
輕量級目錄訪問協議(Lightweight Directory Access Protocol,LDAP) 服務提供程序。
公共對象請求代理架構(Common Object Request Broker Architecture ,CORBA)公共對象服務(Common Object Services ,COS)命名服務提供程序。
Java遠程方法調用( Remote Method Invocation ,RMI)注冊表服務提供程序。
域名系統( Domain Name System ,DNS) 服務提供程序。
以上對JNDI概念內涵和外延最權威的解釋,遺憾的是,J2EE的文檔做得太差了,這點應該像微軟學習學習。
JNDI的范例程序也很少,在網上廣泛流傳的是一些與應用服務器結合的實例,如在Tomcat、JBoss、WebLogic中配置了JNDI的數據源,然后在程序中去發現使用。這些例子大家都會,沒意思。
能否在沒有應用服務器的程序中使用JNDI技術呢?經過驗證,答案是:可以!
下面給個例子:
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";
//文件系統服務的提供者
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);
}
}
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";
//文件系統服務的提供者
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
Process finished with exit code 0
抓個圖看看:

注意,JNDI的概念說的明白,你需要有這個服務,才可以用JNDI API來獲取。
因此還需要安裝文件系統服務。這個例子我不用安裝什么服務,下載個文件服務包就行了。其中的兩個jar文件就包中的。
JNDI技術的實現很復雜,如果要深入研究,需要花費很大的精力,這個例子也許沒什么價值,但對認識JNDI的概念,以及更好的去使用JNDI是很有幫助的。如果要講解JNDI技術,足足夠寫一本厚厚的書。
J2EE就是這樣,把接口留給程序員,把細節實現留給提供商。
相關文檔:
本文出自 “熔 巖” 博客,請務必保留此出處http://lavasoft.blog.51cto.com/62575/191633
文章列表
全站熱搜