EJB 架構旨在解決上述問題:讓開發者專注商業邏輯,將系統級服務 (交易、安全、資源管理、分散式通訊) 委派給容器。
| 目標 | 實現機制 |
|---|---|
| 簡化分散式開發 | 宣告式交易/安全屬性,取代手寫樣板代碼 |
| 關注點分離 | 商業邏輯 (Bean) vs 系統服務 (容器) vs 應用組裝 (Deployer) |
| 工具支援標準化 | 統一元件模型、部署描述符、中繼資料 |
| 平台中立 | Java 平台 + 標準協議 (RMI-IIOP) = Write Once, Run Anywhere |
| 保護既有投資 | 支援舊系統包裝為 Bean (Legacy Wrapper) |
┌─────────────────────────────────────┐
│ Client │ (Java App / Web / CORBA / DCOM)
└──────────────┬──────────────────────┘
│ RMI-IIOP / CORBA / DCOM
┌──────────────▼──────────────────────┐
│ EJB Server │ (資源管理、分散式交易、物件生命週期)
│ ┌───────────────────────────────┐ │
│ │ EJB Container │ │ (Bean 的執行環境)
│ │ ┌─────────┐ ┌─────────────┐ │ │
│ │ │ Session │ │ Entity │ │ │
│ │ │ Bean │ │ Bean │ │ │
│ │ └─────────┘ └─────────────┘ │ │
│ │ ┌─────────────────────────┐ │ │
│ │ │ EJBHome Implementation│ │ │ (工廠、查詢)
│ │ └─────────────────────────┘ │ │
│ │ ┌─────────────────────────┐ │ │
│ │ │ EJBObject (Stub/Skel) │ │ │ (遠端代理、攔截)
│ │ └─────────────────────────┘ │ │
│ └───────────────────────────────┘ │
└─────────────────────────────────────┘
| 角色 | 職責 | 典型單位 |
|---|---|---|
| Server Provider | 分散式交易、底層系統服務 | 資料庫廠商、TP Monitor 廠商 |
| Container Provider | Bean 執行環境、安全、交易攔截、狀態管理 | 應用伺服器廠商 (WebLogic, WebSphere, JBoss) |
| Bean Provider | 撰寫商業邏輯、實作 Bean 介面 | 領域專家、元件開發商 |
| Application Assembler | 組裝第三方 Bean 成應用、建立客戶端 GUI | 系統整合商、應用開發團隊 |
| Deployer | 設定部署屬性 (交易屬性、安全角色)、調優 | 系統管理員、DBA |
Required、RequiresNew、Mandatory、NotSupported、Supports、NeverUserTransactionsecurity-role、method-permissioncontext.isCallerInRole("admin")
public interface ShoppingCart extends EJBObject {
boolean addItem(int itemNumber) throws RemoteException;
boolean purchase() throws RemoteException;
}
public class ShoppingCartEJB implements SessionBean {
public boolean addItem(int itemNumber) { /* JDBC 代碼 */ }
public boolean purchase() { /* JDBC 更新訂單、庫存 */ }
public void ejbCreate(String accountName, String account) { /* 初始化 */ }
// SessionBean 介面方法...
}
注意:Bean 類別不實作 Remote 介面,由容器生成的 EJBObject 代理實作。
public interface CartHome extends EJBHome {
ShoppingCart create(String customerName, String account)
throws RemoteException, BadAccountException;
}
Context ctx = new InitialContext();
CartHome home = (CartHome) ctx.lookup("application/mall/shopping-carts");
ShoppingCart cart = home.create("Emma", "0507");
cart.addItem(100);
cart.addItem(251);
cart.purchase();
EJB 技術將「分散式企業應用開發」從手工管理系統服務的泥沼中解脫,確立了 元件化、宣告式服務、關注點分離、標準化部署 的現代企業級架構範式。雖然 EJB 早期版本因複雜度備受詬病,但其核心思想 — 容器管理基礎設施,開發者專注業務價值 — 深深塑造了 Spring、Java EE / Jakarta EE、MicroProfile 等後續技術棧,至今仍是企業級 Java 開發的基因核心。