EJB 規範對 Session Bean 有嚴格要求,確保 Bean 在容器中正確運行、可被工具處理、支援分散式部署。本文系統整理實作類別、Remote/Home 介面的強制規定、禁止事項與最佳實踐。
public class MyBeanImpl implements SessionBean { ... }
public MyBeanImpl() {} // 必須為 public、無參數
資源清理需在 ejbRemove()、ejbPassivate() 中進行,容器不保證呼叫 finalize。
create(...) → 對應 ejbCreate(...)| 限制 | 說明 |
|---|---|
| public | 容器需透過反射呼叫 |
| 非 static | 需在實例上運作 |
| 非 final | 允許容器覆寫 (攔截器模式) |
| 參數/回傳型別須為 RMI/IIOP 合法型別 | 基本型別、Serializable 物件、Remote 介面 |
| 方法名不可用 ejb 開頭 | 避免與容器回呼方法衝突 |
| 不拋出 RemoteException | 實作類別拋出 EJBException (Runtime) |
// 優點:編譯期檢查方法簽名完整性
public class MyBeanImpl implements SessionBean, MyRemote { ... }
// 缺點:誤用 this 傳遞而非 context.getEJBObject() 導致執行期錯誤
// 建議:不實作 Remote,由部署工具驗證
需參與交易同步處理的有狀態 Bean 可實作:
public interface SessionSynchronization {
void afterBegin(); // 交易開始後
void beforeCompletion(); // 交易提交前
void afterCompletion(boolean committed); // 交易完成後
}
超類別可為另一 Bean 實作類;Helper 方法無可見性、參數、回傳型別限制。
javax.ejb.EJBObject (提供 getHandle、getPrimaryKey、remove、getEJBHome、isIdentical)java.rmi.RemoteExceptionjavax.ejb.EJBHome (提供 remove(Handle)、remove(Object)、getEJBMetaData、getHomeHandle)RemoteExceptioncreate(...) 對應實作類別 ejbCreate(...)create 方法拋出 CreateExceptionfindByPrimaryKey 等查詢方法XXX、Remote XXX、Home XXXHome、實作 XXXImpl 或 XXXBeanSession Bean 規範雖顯繁瑣,每項限制皆為了確保:容器可管理生命週期、支援分散式呼叫、工具可驗證正確性、交易與安全機制生效。遵循規範並採用最佳實踐,才能開發出健壯、可維護、可攜遷的企業級元件。