EJB 3.0 以 POJO 與元資料註解重新定義企業級組件開發。無論執行獨立任務、映射資料庫實體、還是處理非同步訊息,皆可透過標準 Java 類別與註解輕鬆實現。本文系統解析會話 Bean、實體 Bean、訊息驅動 Bean 三大類型的特性、註解用法與客戶端存取模式。
會話 Bean 代表業務流程操作(如「處理訂單」),依對會話狀態保持性分類:
@Stateless(name="CalculateEJB") 註解即可部署。@Stateless(name="CalculateEJB")
public class CalculateEJBBean implements CalculateEJB {
int value = 0;
public String incrementValue() {
value++;
return "value incremented by 1";
}
}
@Remove 註解標記移除實例的方法。實體 Bean 管理持久化資料,對應資料庫記錄(如客戶表的一行),支援多客戶端共享。核心註解:
@Entity:標記實體類別。@Table(name="EMPLOYEES"):指定資料表映射。@Id + @Column(name="EMPNO", primaryKey=true):主鍵欄位映射。@Transient 的欄位皆視為持久化欄位。EJB 3.0 亮點:註解式 O/R 映射,開發期可脫離容器測試(Oracle 應用伺服器實體測試工具)。
@Entity
@Table(name = "EMPLOYEES")
public class Employee implements Serializable {
private int empId;
@Id @Column(name="EMPNO", primaryKey=true)
public int getEmpId() { return empId; }
// 其他 getter/setter...
}
MDB 簡化 JMS 非同步通訊,容器處理隊列/主題設置,自動分派訊息。實作要點:
javax.jms.MessageListener 介面。@MessageDriven 註解配置連線工廠、目的地、選擇器等屬性。onMessage(Message) 為核心處理邏輯入口。
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName="connectionFactoryJndiName", propertyValue="jms/TopicConnectionFactory"),
@ActivationConfigProperty(propertyName="destinationName", propertyValue="jms/myTopic"),
@ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Topic"),
@ActivationConfigProperty(propertyName="messageSelector", propertyValue="RECIPIENT = 'MDB'")
})
public class MessageLogger implements MessageListener, TimedObject {
@Inject MessageDrivenContext mc;
public void onMessage(Message message) {
// 解析訊息、列印、建立 Timer...
}
public void ejbTimeout(Timer timer) { /* Timer 回調 */ }
}
客戶端(獨立應用、JSP、Servlet、另一 EJB)透過遠端/本地介面存取 Bean。容器生成代理(Remote/Local Object)攔截請求、委派實例、返回結果。查找範例:
Context context = new InitialContext();
CalculateEJB myejb = (CalculateEJB) context.lookup("java:comp/env/ejb/CalculateEJB");
myejb.incrementValue();
遠端/本地取決於客戶端與 Bean 是否同 JVM。介面定義契約,Bean 類別實作邏輯,容器負責中介與服務編排。
EJB 3.0 三大類型分工明確:會話 Bean 執行流程、實體 Bean 映射持久化、MDB 處理非同步訊息。註解取代部署描述符,POJO 化降低門檻,容器服務(事務、安全、遠端、生命週期)透明賦能,讓開發者聚焦業務核心。