EJB 部署流程:不只是安裝,更是代碼生成
部署由容器支援,高層次步驟:
- 開發者提供:Bean 類別、Home/Remote 介面、部署描述符、環境屬性、Manifest
- 容器分析
ejb-jar 封裝檔,生成必要類別:Home/Remote 介面實作、Stub/Skeleton、Bean 子類 (注入容器管理代碼)
- 將 Home 介面綁定至 JNDI 命名空間
生成類別為容器專用,不具可攜性;Bean 本身保持標準化可攜。
持久化:Bean-managed vs Container-managed (CMP)
Bean-managed Persistence (BMP)
- 開發者在 Bean 中直接撰寫 JDBC/SQLJ 程式碼
- 直觀但降低可攜性,綁定特定資料庫
Container-managed Persistence (CMP)
- 部署描述符宣告
containerManagedFields 列表
- Bean 程式碼 零資料庫存取呼叫
- 部署時由容器工具建立欄位到資料源的對應映射 (通常非全自動)
- 優點:Bean 可攜性極高,甚至可切換異構資料源
事務管理:容器代管 vs Bean 自管
Container-managed Demarcation (CMT) — 推薦預設
- 部署描述符指定事務屬性:
TX_REQUIRED、TX_SUPPORTS、TX_NOT_SUPPORTED 等
- 容器攔截方法調用,自動開啟/提交/回滾事務
- 客戶端與 Bean 皆無需撰寫事務代碼
Bean-managed Demarcation (BMT)
- 部署描述符指定
TX_BEAN_MANAGED
- Bean 內使用
javax.transaction.UserTransaction 手動控制 begin/commit/rollback
- 容器不介入事務邊界
安全性模型
- AccessControlEntry: 方法/Bean 級別綁定 Identity (用戶/角色)
- RunAs 身分: Bean 存取資源/其他 Bean 時使用的身分 (特定帳號、系統帳號、呼叫者身分)
- 均在部署描述符宣告,容器強制執行
CORBA 與 EJB:互補而非競爭
「EJB 技術極佳補充 CORBA。CORBA 提供強大標準化基礎設施,EJB 讓在其上構建應用更容易。」—— EJB FAQ
- RMI/IIOP: EJB 規範要求 RMI 做分散式呼叫,IIOP 做傳輸協議,實現與 CORBA 互操作
- IDL 映射: Bean 介面對應 IDL,C++ 等 CORBA 客戶端可直接調用
- 命名服務: JNDI 橋接 CORBA Naming Service (COS Naming)
- 事務互操作: JTA/JTS 對應 OTS,支援跨 EJB/CORBA 物件的全域事務
CORBA 映射確保多廠商 EJB Server 互操作性:跨廠商 Bean 存取、混合事務、統一客戶端。
三層 EJB 應用架構實戰

| 層級 | 角色 | 技術 |
| 第一層 (瘦客戶端) | 呈現 | Web Browser (HTML/GIF/HTTP) |
| 第二層 (Web 應用伺服器) | 控制器、資料封裝、介面生成 | Servlet (控制器)、JavaBean (資料封裝)、JSP (動態頁面)、EJB Server 功能 |
| 第三層 (企業資源) | 資料與業務邏輯 | 關聯式/物件資料庫、事務監視器、legacy 系統 |
庫存更新業務流程範例
- Browser 提交表單 → Servlet (控制器) 解析請求
- Servlet 透過 JNDI 取得 Entity Bean Home →
findByPrimaryKey() 定位產品
- 呼叫 Remote 介面更新庫存 → 容器透明啟動事務 (CMT) → 容器透明持久化寫入 DB
- 結果存入 JavaBean (資料封裝) → 轉發 JSP 呈現 → 回傳 Browser
架構優勢總結
- 業務邏輯封裝於可重用、可攜 Bean
- 既有系統零/少改動整合 (包裝成 Entity Bean)
- 運行時服務 (事務、持久化、並發) 外移至容器,Bean 專注業務
- Servlet 控制邏輯與 JSP 呈現分離,獨立演進
- 全 Java 技術棧,JVM 即可攜
- 保護既有 IT 投資 (Legacy 包裝策略)
總結
EJB 代表 Java 進入任務關鍵企業系統的關鍵里程碑。將業務邏輯與中間件服務分離,讓開發者專注核心價值,容器負責底層複雜度。多廠商支援與 CORBA 互操作,確保開放、可擴展的企業級平台。