命名服務(naming service) 命名服務是計算機系統中的一個基本功能。命名服務是將名字和計算機中的一個對象相關聯,通過名字可以方便地找到對應的對象。例如,計算機中的文件系統就包含了一個命名服務,你可以通過文件名找到對應的文件對象。 目錄服務(directory service) 目錄服務是命名服務的延伸,目錄服務不只保存對象和對象名的匹配,而且保存這個對象的各種屬性,你可以對這些屬性進行查詢、修改、增加、刪除操作。 JNDI(Java Naming Directory Interface) JNDI是一些標准API接口,Java程序通過這些API可以訪問命名目錄服務。JNDI的定義不依賴於任何獨立的命名目錄服務器,對於各種命名目錄服務器,都可通過統一的JNDI接口調用。JNDI結構如下: JNDI結構包括兩組API:JNDI API(Application Programming Interface)和JNDI SPI(Service Provider Interface)。Java應用程序通過JNDI API訪問各種命名目錄服務。JNDI SPI使得各種命名目錄服務透明地加入到JNDI結構中,如上圖中的LDAP、DNS、NIS等服務通過JNDI SPI加入到JNDI結構中,從而使Java應用程序能夠通過JNDI API訪問這些服務。 JNDI Context Context是一系列命名到對象綁定的集合,Context提供以下主要接口訪問命名服務: bind(Name name, Object obj) 建立一個命名到一個對象的匹配關系,也叫綁定 lookup(String name) 通過命名查找其對應的對象 rebind(Name name, Object obj) 重新綁定一個命名到對象,覆蓋原來的綁定 unbind(Name name) 解除這個命名到其匹配對象的綁定關系 ... ... Apusic JNDI 應用舉例 Apusic Application Server包含一個完全遵循JNDI標准的命名服務器,下面我們舉例說明如何通過JNDI接口找到你需要調用的EJB Home接口。 Context ctx = null; try { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.apusic.jndi.InitialContextFactory"); env.put(Context.PROVIDER_URL, "rmi://localhost:6888"); env.put(Context.SECURITY_PRINCIPAL, null); env.put(Context.SECURITY_CREDENTIALS, null); ctx = new InitialContext(env); } catch (Exception e) { System.err.println("Cannot get initial context: " + e); System.exit(1); } AccountHome home = null; try { home = (AccountHome) ctx.lookup("CMAccountHome"); } catch (Exception e) { System.err.println("Cannot lookup CMAccountHome" + e); System.exit(1); } 首先,通過Hashtable env傳遞JNDI調用參數,取得JNDI Context ctx,各參數說明如下: Context.INITIAL_CONTEXT_FACTORY: 指定jndi環境的工廠,在Apusic中必須為 com.apusic.jndi.InitialContextFactory Context.PROVIDER_URL: 指定命名服務提供者的URL,格式為:rmi://localhost:6888 Context.SECURITY_PRINCIPAL: 指定用戶身份,null為“匿名用戶” Context.SECURITY_CREDENTIALS: 指定用戶密碼,同上 然後,通過JNDI Context ctx 的lookup方法找到"CMAccountHome"綁定的CMaccountBean的Home接口。