首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Enterprise JavaBeans 入門指南:JNDI、Home 介面與客戶端開發

     編輯:Java 相關知識

EJB 客戶端架構概覽

EJB 客戶端應用形式多樣,可以是 Applet、獨立應用程式、Servlet 或另一個 Bean。其核心優勢在於:編程模型簡單、無過度開銷,且能透明地存取分散式企業級服務。

JNDI:命名服務的核心角色

基本概念

JNDI (Java Naming and Directory Interface) 提供統一的命名服務,類似電話黃頁,將邏輯名稱綁定到實際物件。核心組件包括:

  • Context:名稱-物件綁定的容器,支援巢狀結構形成目錄樹,頂層為 InitialContext
  • Binding:伺服器啟動時自動將 Bean 名稱綁定到其 Home 物件;客戶端透過名稱查找
  • 核心方法:bind(name, obj)、lookup(name)

為何需要 JNDI?

解決「客戶端不知道如何定位 EJB 伺服器」的問題。透過命名服務器,多台伺服器可構成統一命名空間,客戶端只需知道:

  1. 如何定位命名服務器 (Provider URL)
  2. 目標物件在命名服務器上的邏輯名稱

獲取與使用 EJB 的標準流程

1. 建立 InitialContext

public Context getInitialContext() throws NamingException {
    Hashtable props = new Hashtable(2);
    props.put(Context.PROVIDER_URL, getNameServerURL());
    props.put(Context.INITIAL_CONTEXT_FACTORY, getInitialContextFactoryClassName());
    return new InitialContext(props);
}

最佳實踐:廠商特定常數 (如 INITIAL_CONTEXT_FACTORY, PROVIDER_URL) 不應硬編碼,應從屬性檔或 Servlet init 參數讀取。

2. 查找並窄化 Home 介面

public MyBeanHome findMyBeanHome() throws NamingException {
    Context context = getInitialContext();
    try {
        Object object = context.lookup("MyBean");
        return (MyBeanHome) PortableRemoteObject.narrow(object, MyBeanHome.class);
    } finally {
        context.close(); // 及時關閉,Context 非執行緒安全
    }
}

PortableRemoteObject.narrow() 是 RMI-IIOP 環境下的類型安全轉換,替代傳統強制轉型。

3. 創建/查找 Bean 並調用業務方法

try {
    MyBean bean = findMyBeanHome().create(); // 或 findByPrimaryKey(...)
    bean.computeSomethingOrOther(42);
    // 無需顯式清理,僅停止引用即可
} catch (NamingException e) {
    // 處理命名異常
}

進階最佳實踐

Home 介面快取

JNDI 查找開銷較大,建議快取 Home 介面引用:

public synchronized BankAccountHome getBankAccountHome() throws NamingException {
    if (bankAccountHome == null)
        bankAccountHome = findBankAccountHome();
    return bankAccountHome;
}

注意:Home/Bean 引用不可序列化,不適用於跨 JVM 傳遞。

Servlet 整合範例

public void doGet(...) throws ... {
    PrintWriter out = response.getWriter();
    try {
        BankAccount account = getBankAccountHome().findById(42);
        double balance = account.getBalance();
        out.println("Balance is: " + balance);
    } catch (Exception e) {
        out.println("A problem has occurred with the server.");
    }
}

資源管理關鍵點

  • Context 使用完畢立即在 finally 區塊關閉
  • 避免長期持有 Context 導致資源洩漏
  • 多執行緒環境下謹慎共享 Context 實例

掌握 JNDI 與 Home 介面的正確使用模式,是構建健壯 EJB 客戶端應用的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved