JSR 220 EJB 3.0 早期草案二核心目標:簡化 J2EE 開發模型。簡化 API 文件聚焦 Session Bean 與 Message-Driven Bean,實體 Bean 另由持久化 API 定義。本文基於草案二分析關鍵特性與不足。
// 顯式業務接口
@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。
事務、安全等服務通過註解聲明:
@Stateless
public class StockBean {
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public double getQuote(String symbol) { return 100.33; }
}
部署描述符仍可作為備選,但兩者並用時描述符覆蓋註解。
替代強制實現 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 { ... }
類 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 內部定義攔截器方法。
替代 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 方法。
| 適用註解 | 適用部署描述符 |
|---|---|
| 特定 Bean 類的元數據 (事務屬性、安全角色) | 部署時可能變更的映射 (資源引用→實際 DataSource) |
| 細粒度方法級配置 | 跨多 Bean 統一策略 (如整套 EJB 共享安全角色) |
建議:事務語義等關鍵行為不應由部署人員覆蓋,JCP 應在後續草案明確限制。
草案二仍有缺失 (核心契約文件缺失),註解最終語法可能調整。現階段建議: