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

EJB 3.0 簡化 API 規範深度解析:POJO、註解、攔截器與依賴注入

     編輯:Java 相關知識

規範背景

JSR 220 EJB 3.0 早期草案二核心目標:簡化 J2EE 開發模型。簡化 API 文件聚焦 Session Bean 與 Message-Driven Bean,實體 Bean 另由持久化 API 定義。本文基於草案二分析關鍵特性與不足。

核心特性

1. POJO 化與註解驅動

  • 不再強制實現 Home/Remote 接口,不繼承 EJB 基類
  • J2SE 5.0 註解成為主要配置方式,類經註解處理器變為 EJB 組件
  • 業務接口 可顯式實現或由容器自動生成

無狀態 Session Bean 範例

// 顯式業務接口
@Stateless
public class StockBean implements Stock {
    public double getQuote(String symbol) { return 100.33; }
}

// 隱式業務接口 (所有 public 非注入方法自動暴露)
@Stateless
public class StockBean {
    public double getQuote(String symbol) { return 100.33; }
}

// 精確控制暴露方法
@Stateless
public class StockBean {
    @BusinessMethod
    public double getQuote(String symbol) { return 100.33; }
}

遠程/本地接口指定

@Stateless
public class StockBean {
    @Remote
    public double getQuote(String symbol) { return 100.33; }
}

註解可標註在類或方法上。Web 服務暴露委託 JSR 181。

2. 容器服務註解化

事務、安全等服務通過註解聲明:

@Stateless
public class StockBean {
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public double getQuote(String symbol) { return 100.33; }
}

部署描述符仍可作為備選,但兩者並用時描述符覆蓋註解。

3. 回調機制現代化

替代強制實現 ejbCreate() 等空方法:

  • 生命週期回調方法:@PostConstruct、@PreDestroy 等標註 Bean 內方法
  • 回調監聽器類:獨立類含 @PrePassivate 等方法,參數為 Object (Bean 實例),通過 @CallbackListener 註冊
public class MyCallbackListener {
    @PrePassivate public void clearCache(Object obj) { ... }
}

@CallbackListener(MyCallbackListener.class)
@Stateless public class StockBean implements Stock { ... }

4. 攔截器

類 Servlet Filter,實現橫切邏輯 (審計、日誌):

public class StockRequestAudit {
    @AroundInvoke
    public Object auditStockOperation(InvocationContext inv) throws Exception {
        try {
            Object result = inv.proceed(); // 執行目標方法
            Auditor.audit(inv.getMethod().getName(), inv.getParameters()[0]);
            return result;
        } catch (Exception ex) {
            Auditor.auditFailure(ex);
            throw ex;
        }
    }
}

@Stateless @Interceptors({StockRequestAudit.class})
public class StockBean implements Stock { ... }

支援多攔截器鏈,順序由註解數組決定。亦可在 Bean 內部定義攔截器方法。

5. 依賴注入

替代 JNDI 查找,聲明式注入資源與 EJB 引用:

@Stateless
public class StockBean implements Stock {
    @EJB(name="MarketBean", businessInterface=Market.class)
    Market market;

    @Resource(name="StockDB", type=javax.sql.DataSource.class)
    DataSource stockDS;

    public double getQuote(String symbol) {
        Connection con = stockDS.getConnection();
        return market.getCurrentPrice(symbol);
    }
}

注入點支援欄位與 Setter 方法。

關鍵爭議:註解 vs 部署描述符

適用註解適用部署描述符
特定 Bean 類的元數據 (事務屬性、安全角色)部署時可能變更的映射 (資源引用→實際 DataSource)
細粒度方法級配置跨多 Bean 統一策略 (如整套 EJB 共享安全角色)

建議:事務語義等關鍵行為不應由部署人員覆蓋,JCP 應在後續草案明確限制。

結語與建議

草案二仍有缺失 (核心契約文件缺失),註解最終語法可能調整。現階段建議:

  1. 繼續使用 EJB 2.x 最佳實踐 (分層架構)
  2. 關注 JSR 220 後續草案與 RI 實現
  3. 評估註解對團隊開發流程、工具鏈的影響
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved