JavaBean 與 Enterprise JavaBean (EJB) 雖同屬「組件」範疇,但定位、能力、部署模型截然不同。本文從定義、介面契約、部署運行、服務質量、演進歷程五個維度深度對比,幫助架構師根據業務場景做出正確技術選型。
| 維度 | JavaBean | EJB (Enterprise JavaBean) |
|---|---|---|
| 定義 | 遵循命名慣例(屬性 getter/setter、無參建構子、可序列化)的普通 Java 類別 | 部署於 EJB 容器中、由容器管理生命週期、提供企業級服務的伺服器端組件 |
| 核心契約 | Properties(內省機制)、Events、Persistence、Introspection | Remote/Local 介面、Home 介面 (EJB 2.x)、Metadata Annotations (EJB 3+)、Deployment Descriptor |
| 可視性 | 通常可視(GUI 組件:按鈕、表格、圖表) | 非可視、遠程業務邏輯組件 |
| 執行環境 | 單一 JVM 進程內(桌面、Applet、Servlet 容器) | EJB 容器(應用伺服器:WebSphere、WebLogic、JBoss/WildFly、GlassFish) |
| 分散式能力 | 無原生支援(需 RMI、Web Services 手動實現) | 原生支援遠程呼叫(RMI-IIOP/HTTP)、負載均衡、叢集、容錯移轉 |
EJB 核心價值在於宣告式服務質量,開發者專注業務邏輯,容器負責:
| 服務 | 描述 | 配置方式 |
|---|---|---|
| 事務管理 | ACID 事務、分散式事務 (JTA)、巢狀事務 | @TransactionAttribute、部署描述符 |
| 安全性 | 角色基礎存取控制 (RBAC)、方法級權限、身份傳播 | @RolesAllowed、@PermitAll、@DenyAll |
| 並發控制 | 容器管理併發存取、單例鎖、讀寫鎖 | @ConcurrencyManagement、@Lock |
| 持久化 | Entity Bean (EJB 2.x) / JPA Entity (EJB 3+)、容器管理關係 | JPA 註解、ORM 映射 |
| 生命週期管理 | 建立、銷毀、激活、鈍化、池化 | 容器自動管理,@PostConstruct/@PreDestroy 回調 |
| 依賴注入 | 資料源、JMS、Timer、其他 EJB、CDI Bean | @EJB、@Resource、@Inject |
| 遠程呼叫 | 透明的網路通訊、序列化、Stub/Skeleton | @Remote 介面自動生成 Proxy |
| 非同步處理 | @Asynchronous 方法、Future/Void 返回 | EJB 3.1+ |
// 1. 普通 JavaBean(桌面/WEB 表單綁定)
public class OrderForm implements Serializable {
private String orderId;
private BigDecimal amount;
// getter/setter...
}
// 2. 加上註解變為 JPA 實體(持久化)
@Entity
public class Order implements Serializable {
@Id String orderId;
BigDecimal amount;
// ...
}
// 3. 定義業務介面(Local/Remote)
@Local
public interface OrderService {
void placeOrder(Order order);
Order findOrder(String id);
}
// 4. 實作 Stateless Session Bean(交易腳本/領域服務)
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class OrderServiceBean implements OrderService {
@PersistenceContext EntityManager em;
@EJB InventoryService inventory;
public void placeOrder(Order order) {
em.persist(order);
inventory.reserve(order.getItems());
}
public Order findOrder(String id) { return em.find(Order.class, id); }
}
| 階段 | JavaBean | EJB |
|---|---|---|
| 建構 | javac 編譯 → JAR | 同樣編譯,但需驗證註解/描述符 |
| 打包 | JAR / WAR 內的類別 | EJB-JAR (META-INF/ejb-jar.xml) 或 WAR 內直放 (EJB 3.1+) |
| 部署 | 類別路徑、Spring 容器掃描 | 應用伺服器部署工具、JNDI 註冊、容器掃描註解 |
| 呼叫 | 直接 new、Spring 注入 | JNDI 查找 / @EJB 注入 / CDI 注入 → 容器生成 Proxy |
| 執行 | 呼叫者線程直接執行 | 容器攔截:事務、安全、並發、日誌、監控 → 委派給 Bean 實例 |
早期 JavaBean 可透過橋接器封裝為 ActiveX 控件(Beans.instantiate + COM Wrapper),運行於 IE/Windows 桌面。EJB 作為伺服器端組件無法直接成 ActiveX,但可由用戶端 JavaBean/ActiveX 呼叫。現代架構已棄用 ActiveX,改用 Web 標準(HTML5/JS/REST)。
| 場景 | 推薦方案 | 理由 |
|---|---|---|
| 桌面 GUI 組件、表單綁定、簡單 DTO | JavaBean / POJO / Record (Java 14+) | 輕量、無容器依賴、可序列化跨層傳輸 |
| Web 應用 Controller/Service/Repository (Spring) | Spring Bean (POJO + @Component/@Service) | Spring 容器提供 DI、AOP、事務,輕於 EJB |
| 分散式微服務、跨 JVM 遠程呼叫 | REST/gRPC + Spring Cloud / Dubbo | 技術棧中立、雲原生友好、避免 EJB 專有協議綁定 |
| 傳統 Java EE 單體、需強事務/安全/並發容器服務 | EJB 3.2 (Stateless/Singleton/Stateful) | 容器級服務質量、JTA 分散式事務、標準化 |
| 批次處理、排程任務 | @Singleton + @Schedule / Spring @Scheduled | 容器管理生命週期、叢集單點執行 |
JavaBean 是組件模型的基石:慣例優於配置、可視化設計工具支援、跨層傳輸載體。EJB 是企業級分散式組件模型:容器管理服務質量、遠程透明化、標準化部署。現代架構趨勢:Spring 生態取代 EJB 成為事實標準,微服務以 REST/gRPC 替代遠程 EJB。理解兩者本質差異,才能在遷移重構、技術選型、混合架構中做出清醒決策:業務邏輯用 POJO,基礎設施服務交給容器/框架。