2011-02-28 79 views
22

JNDI就像是類固醇地圖嗎?我使用一個鍵來查找對象的引用。 另外,什麼是InitialContext?我似乎不明白這個想法。瞭解JNDI

+5

不知道有關類固醇,它總是比平凡實現的地圖慢,並且只允許鍵或字符串的名稱。如果你問我:這是一個殘缺版本的地圖 – bestsss 2011-02-28 14:56:36

回答

32

概念上,JNDI就像是類固醇上的System.getProperties()

System.getProperties()允許您從命令行將String參數傳遞給您的代碼。同樣,JNDI允許您在代碼之外配置任意對象(例如,在應用程序服務器配置文件中),然後在您的代碼中使用它們。

換句話說,它的實現是Service Locator pattern:您的代碼從中心註冊表獲取由環境配置的服務。

與服務定位器通常一樣,您的代碼應該有一些入口點來訪問服務定位器。 InitialContext是這個入口點:您創建InitialContext,然後從lookup()從JNDI獲得所需的服務。

9

讓我們來談談代碼,加載jndi的類是一個單例,你會提供它到你的jndi資源的關鍵。下面,我正在加載一個數據源(datasource =「JDBC/dummy」)。

try { 
    Context initCtx = new InitialContext(); 
    Context envCtx = (Context) initCtx.lookup("jndicontext"); 
    ds = (DataSource) envCtx.lookup("JDBC/dummy"); 
} catch (Exception e) { 
    log.error(e); 
} 

初始上下文將資源作爲對象返回給我。我可以用同樣的方法加載一個bean。

Connection conn = ds.getConnection(); 

但是有什麼意義呢?只爲特定環境存儲對象而不考慮其類型。然後在飛行中更改他們的信息。你會注意到,我沒有寫任何登錄/密碼。

在此示例中,根據當前環境: - 在生產中,它返回到數據庫的連接。 - 在集成環境中,它返回到另一個數據庫的連接 - 在開發過程中,它實例化該類的另一個實現(mock ones),並使用xml文件作爲數據源。

Regards