文章出處

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。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架構
注 意,關于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) 服務提供程序。
 
以上對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);
        }
}
 
運行結果:
名稱:[F:\fscontext-1_2-beta3.zip]綁定的對象是:F:\fscontext-1_2-beta3.zip

Process finished with exit code 0
 
抓個圖看看:
 
注意,JNDI的概念說的明白,你需要有這個服務,才可以用JNDI API來獲取。
因此還需要安裝文件系統服務。這個例子我不用安裝什么服務,下載個文件服務包就行了。其中的兩個jar文件就包中的。
 
JNDI技術的實現很復雜,如果要深入研究,需要花費很大的精力,這個例子也許沒什么價值,但對認識JNDI的概念,以及更好的去使用JNDI是很有幫助的。如果要講解JNDI技術,足足夠寫一本厚厚的書。
 
J2EE就是這樣,把接口留給程序員,把細節實現留給提供商。
 
相關文檔:
 

本文出自 “熔 巖” 博客,請務必保留此出處http://lavasoft.blog.51cto.com/62575/191633


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()