EJB 作為 J2EE 核心組件模型,概念繁多、版本演進快。本文以問答形式,系統梳理 EJB 2.0/1.1 差異、與 JavaBean 區別、三大 Bean 類型與生命週期、事務機制、六大角色、容器服務、禁止操作、調用流程,構建完整知識骨架,適合面試複習、架構決策參考、團隊知識對齊。
六大角色:Bean 提供者、應用組合者、EJB 容器、EJB 配置工具、EJB 服務提供者、系統管理員。
核心:EJB 容器管理創建、銷毀、激活、鈍化、數據庫連接等。
2.0 新增:本地接口、CMP 2.0(EJB QL、關係映射)、Message Driven Bean、Home 業務方法、ejbSelect。
| 維度 | JavaBean | Enterprise JavaBean |
|---|---|---|
| 規範 | 無嚴格規範,任意類可為 Bean | 嚴格 EJB 規範 |
| 運行模型 | 進程內(本地 COM 類比) | 進程間、分布式(DCOM 類比) |
| 訪問方式 | 直接調用 | 遠程 RMI,經容器代理 |
| 容器依賴 | Web 容器(如 Tomcat) | EJB 容器 |
| 持久化 | 實現 Serializable | 容器管理(CMP)或 Bean 管理(BMP) |
| 典型用途 | GUI 組件、DTO | 分布式業務組件 |
OMG OTS、Sun JTS/JTA、X/Open XA 接口。容器聲明式管理(CMT)或 Bean 程序化管理(BMT)。
六角色:EJB 組件開發者、應用組合者、部署者、EJB Server 提供者、EJB Container 提供者、系統管理員。
三對象:Remote(Local) 接口、Home(LocalHome) 接口、Bean 類。
生命週期管理、代碼生成、持久化管理、安全、事務管理、鎖與並發管理。
| Bean 類型 | 管理機制 | 核心流程 |
|---|---|---|
| Stateless Session / Entity / MDB | 池化 | 創建 → 設置上下文 → 業務調用 → 歸池(不銷毀) |
| Stateful Session / Entity | 緩存 + 激活/鈍化 | 創建 → 綁定客戶 → 業務調用 → 閒置鈍化(序列化存儲) → 激活(反序列化恢復) → 移除 |
鈍化/激活鉤子:ejbPassivate() / ejbActivate()。
JNDI(命名)、RMI(遠程調用)、JTA(事務)。
| 維度 | Stateful | Stateless |
|---|---|---|
| 狀態記錄 | 記錄調用者狀態,一用戶一實例 | 不記錄,多用戶共享實例 |
| 記憶體佔用 | 高 | 低 |
| 適用場景 | 向導流程、購物車、會話上下文 | 無狀態服務、高併發業務 |
@Remote/@Local 註解EntityManager 替代 Home@PostConstruct/@PreDestroy/@PrePassivate/@PostActivate@EJB/@Resource/@PersistenceContextEJB 知識體系龐大但邏輯自洽。掌握三大類型、兩種會話模式、兩種持久化、容器六大服務、聲明式事務、六角色分工,即持有 EJB 架構決策的核心鑰匙。版本演進不改核心模型,註解簡化了形式,契約精神長存。