什麼是 EJB?
Enterprise JavaBeans (EJB)** 是 Java EE 標準的**服務端組件模型**,提供可移植、可重用、可伸縮的業務應用開發平台。EJB 組件運行在 EJB 容器中,容器提供企業級服務,開發者專注業務邏輯。
為什麼選擇 EJB?
| 優勢 | 說明 |
| 易用性 | 容器提供事務、安全、持久化等服務,開發者零配置/少配置使用 |
| 集成解決方案 | 應用服務器(WebLogic、WildFly、WebSphere)內置完整 Java EE 技術棧 |
| 開放標準 | Java EE/Jakarta EE 規範,避免廠商鎖定 |
| 廣泛廠商支持 | Oracle、IBM、Red Hat、TomEE 等主流服務器實現 |
| 高質量代碼基礎 | 經過大規模生產驗證的成熟技術 |
| 集群與高可用 | 內置負載均衡、故障轉移、會話複製 |
| 可重用組件 | 業務邏輯封裝為組件,跨應用復用 |
EJB 容器提供的 13 大核心服務
- 集成:JNDI、JMS、JCA、Web Services 統一接入
- 池化:無狀態 Bean、數據源、連接池自動管理
- 線程安全:容器保證 Bean 實例單線程訪問,無需手動同步
- 狀態管理:有狀態會話 Bean 自動激活/鈍化
- 消息服務:消息驅動 Bean (MDB) 異步處理
- 事務管理:聲明式事務(CMT)、程序化事務(BMT)、分布式事務 (JTA/XA)
- 安全:聲明式授權(`@RolesAllowed`)、認證整合、傳播身份
- 攔截器:AOP 風格橫切關注點(日誌、審計、性能監控)
- 遠程訪問:RMI/IIOP、HTTP/REST 透明遠程調用
- Web 服務:JAX-WS/JAX-RS 無縫發布為 SOAP/REST 端點
- 持久化:JPA 實體 Bean、實體管理器自動注入
- 緩存:二級緩存、查詢結果緩存
- 性能優化:懶加載、批量操作、預取策略
EJB 3.x 核心新特性(對比 2.x 跳躍式簡化)
| 特性 | EJB 2.x | EJB 3.x |
| 程式設計模型 | 接口 + Home/Remote + XML 配置 | **POJO + 註解**,無接口可選 |
| 依賴注入 | JNDI 手動查找 | **@EJB/@Resource/@Inject** 自動注入 |
| 持久化 | Entity Bean (CMP/BMP) 複雜 | **JPA 標準 ORM**,EntityManager 簡潔 |
| 單元測試 | 需容器環境 | **POJO 可獨立測試**,Mock 友好 |
| 攔截器 | 無 | **@AroundInvoke** 方法攔截 |
| 異步調用 | 無 | **@Asynchronous** + Future |
| 定時服務 | 無 | **@Schedule** 聲明式定時 |
三類核心 Bean 類型
| Bean 類型 | 註解 | 核心特徵 | 典型場景 |
| 無狀態會話 Bean | @Stateless | 無會話狀態、池化、高併發 | 業務邏輯、服務外觀、Web Service 端點 |
| 有狀態會話 Bean | @Stateful | 維護客戶會話狀態、激活/鈍化 | 購物車、多步驟向導、會話上下文 |
| 單例 Bean | @Singleton | 應用級單例、啟動順序控制、併發管理 | 緩存管理、配置中心、全局序列號生成 |
| 消息驅動 Bean | @MessageDriven | JMS 消費者、異步處理、事務性消費 | 訂單處理、郵件發送、日誌收集、事件驅動 |
最簡 EJB 3.x 示例
// 無狀態會話 Bean
@Stateless
public class OrderService {
@PersistenceContext
EntityManager em;
@Resource
SessionContext ctx;
@EJB
InventoryService inventory;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public Order createOrder(OrderRequest req) {
// 業務邏輯:扣庫存、創建訂單、發送消息
inventory.reserve(req.getItems());
Order order = new Order(req);
em.persist(order);
return order;
}
}
// 本地接口(可選,無接口視圖)
@Local
public interface OrderServiceLocal { ... }
部署與調用
- 打包為 `.jar` (EJB 模塊) 或 `.war` (Web 模塊內嵌 EJB)
- 部署至 Java EE 兼容服務器
- 客戶端通過 `@EJB` 注入、JNDI 查找、遠程 EJB 調用
現狀與建議
Jakarta EE 9+ (原 Java EE) 持續演進,**EJB 仍是核心組件**。但 Spring 生態提供了輕量級替代方案(Spring Transaction、Spring Data JPA、@Async、@Scheduled)。選型建議:
- **標準化要求高、應用服務器標準化環境** → EJB
- **雲原生、微服務、容器化部署、技術棧靈活** → Spring Boot + JPA
- **遷移策略**:EJB 可漸進式遷移至 Spring(共享 JPA 實體、JTA 事務管理器)