EJB (Enterprise JavaBeans) 是 J2EE 標準中的伺服器端元件模型,封裝業務邏輯、交易、安全等企業級服務。雖然歷經多版本演進,但其核心架構思想仍具參考價值。本文系統介紹 EJB 動機、容器服務、三大 Bean 類型、程式結構與部署描述符。
EJB 容器提供執行環境(交易、安全、生命週期管理),可內建於 J2EE 伺服器,也可獨立存在。客戶端透過 JNDI 查找 Home/Remote 介面與 Bean 互動。
| 類型 | 用途 | 狀態管理 | 典型案例 |
|---|---|---|---|
| Session Bean (會話 Bean) |
執行業務流程、工作流 | Stateless:無狀態,適合單一請求/回應 Stateful:維持客戶會話狀態 |
Stateless:查詢公開 Bug 列表 Stateful:購物車 |
| Entity Bean (實體 Bean) |
持久化業務資料(對應資料表記錄) | 持久身份由 Primary Key 識別 | 用戶資料、訂單記錄 |
| Message-Driven Bean (訊息驅動 Bean) |
非同步訊息處理 (JMS) | 無狀態,由容器管理實例池 | 異步匯率更新、訂單通知處理 |
// Client
Context ctx = new InitialContext();
VerySimpleHome home = (VerySimpleHome) ctx.lookup("simpleton");
VerySimple ejb = home.create();
ejb.setName("Fredrick");
System.out.println("My name is " + ejb.getName());
ejb.remove();
// Home Interface
public interface VerySimpleHome extends EJBHome {
VerySimple create() throws CreateException, RemoteException;
}
// Remote Interface
public interface VerySimple extends EJBObject {
String getName() throws RemoteException;
void setName(String n) throws RemoteException;
}
// Bean Implementation
public class VerySimpleEJB implements SessionBean {
private String name;
private SessionContext ctx;
public void ejbCreate() {}
public void ejbRemove() {}
public void ejbActivate() {}
public void ejbPassivate() {}
public void setSessionContext(SessionContext ctx) { this.ctx = ctx; }
public String getName() { return name; }
public void setName(String n) { name = (n != null) ? n : "Igor"; }
}
<ejb-jar>
<enterprise-beans>
<session>
<ejb-name>VerySimple</ejb-name>
<home>org.shifter.ejb.VerySimpleHome</home>
<remote>org.shifter.ejb.VerySimple</remote>
<ejb-class>org.shifter.ejb.VerySimpleEJB</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>VerySimple</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
<weblogic-ejb-jar>
<weblogic-enterprise-bean>
<ejb-name>VerySimple</ejb-name>
<jndi-name>simpleton</jndi-name>
</weblogic-enterprise-bean>
</weblogic-ejb-jar>
| 優點 | 挑戰 |
|---|---|
| 程式碼重用率高、開發效率提升 | 語法規範嚴格、學習曲線陡峭 |
| 容器管理交易/安全/實例,減少樣板碼 | 除錯困難(缺乏容器原始碼)、部署流程繁瑣 |
| 透過部署描述符彈性配置,無需重編譯 | 容器故障可能影響所有 Bean、效能調校複雜 |
EJB 以元件化、容器管理服務解決企業級應用複雜度。雖然現代框架(Spring、Jakarta EE)已演進出更輕量的替代方案,但理解 EJB 架構有助於掌握分散式元件設計精髓。