Session Bean 代表客戶與 EJB 容器之間的會話,封裝商業邏輯、協調 Entity Bean、或直接存取資料庫。是企業級應用中「處理流程」的核心元件。
先定義 Remote/Home 介面 (契約),再實作 Bean 類別。契約優先確保:客戶端與 Bean 解耦、團隊並行開發、介面穩定性。
package usingj2ee.hello;
import java.rmi.*;
import javax.ejb.*;
public interface HelloWorldSession extends EJBObject {
String getGreeting() throws RemoteException;
void setGreeting(String aGreeting) throws RemoteException;
}
EJBObject:獲得分散式物件身分 (getHandle、remove、isIdentical 等)RemoteException:網路呼叫失敗語意
package usingj2ee.hello;
import java.rmi.*;
import javax.ejb.*;
public interface HelloWorldSessionHome extends EJBHome {
HelloWorldSession create() throws RemoteException, CreateException;
HelloWorldSession create(String aGreeting) throws RemoteException, CreateException;
}
EJBHome:提供生命週期管理方法create:支援預設值與客製化初始化CreateException:建立失敗業務語意 (如參數驗證失敗)
package usingj2ee.hello;
import java.rmi.*;
import java.util.*;
import javax.ejb.*;
public class HelloWorldSessionImpl implements SessionBean {
// 會話狀態欄位
protected String greeting;
// 容器提供的執行環境
private SessionContext context;
// 必須:public 無參建構子
public HelloWorldSessionImpl() {}
// 容器回呼:注入 SessionContext
public void setSessionContext(SessionContext aContext) {
context = aContext;
}
// 容器回呼:對應 Home.create()
public void ejbCreate() throws CreateException {
greeting = "Hello World!";
}
// 容器回呼:對應 Home.create(String)
public void ejbCreate(String aGreeting) throws CreateException {
greeting = aGreeting;
}
// 容器回呼:Bean 從 Passivate 狀態喚醒
public void ejbActivate() {}
// 容器回呼:Bean 進入 Passivate 狀態 (序列化前)
public void ejbPassivate() {}
// 容器回呼:Bean 被移除前清理
public void ejbRemove() {}
// 業務方法:實作 Remote 介面定義 (不拋出 RemoteException)
public String getGreeting() { return greeting; }
public void setGreeting(String aGreeting) { greeting = aGreeting; }
}
| Home 介面 | 實作類別 | 觸發時機 |
|---|---|---|
| create() | ejbCreate() | 客戶建立新會話 |
| create(String) | ejbCreate(String) | 客戶建立帶參數會話 |
| remove() | ejbRemove() | 客戶結束會話或容器逾時 |
| (容器管理) | ejbPassivate() | 容器閒置 Bean 釋放資源 |
| (容器管理) | ejbActivate() | 容器重新啟用 Bean |
| 元件 | 命名模式 | 範例 |
|---|---|---|
| Remote 介面 | XXX | ShoppingCart |
| Home 介面 | XXXHome | ShoppingCartHome |
| 實作類別 | XXXImpl / XXXBean | ShoppingCartImpl |
| Bean 邏輯名 | XXX | ShoppingCart bean |
團隊開發務必統一命名,避免混淆。
早期 EJB 開發需手寫大量樣板代碼。現代 IDE (IntelliJ IDEA、Eclipse、NetBeans) 提供:
「對小專案,EJB 樣板代碼成本與業務代碼相当;但應用增長時,元件化架構讓混合組裝新功能變簡單。」
Hello World Session Bean 雖簡單,却完整展示了 EJB 核心架構:契約介面 (Remote/Home)、容器管理生命週期 (ejbCreate/Passivate/Activate/Remove)、會話狀態封裝、SessionContext 環境存取。掌握此基礎模式,即可進階學習無狀態 Bean、Entity Bean、訊息驅動 Bean 等企業級元件模型。