長久以來,Java EE(早期稱為 J2EE)雖功能強大,卻因架構過於龐雜、配置文件泛濫、組件模型僵化,嚴重阻礙了開發效率與新手入門。早期的 EJB 2.x 要求開發者實作大量樣板代碼、編寫冗長的 XML 部署描述符,並遵循嚴格的繼承體系,導致開發體驗極差。
過去幾年間,開源社區與 JCP(Java Community Process)攜手推動簡化浪潮:Hibernate、Spring、AOP、XDoclet 等框架率先實踐 POJO 服務、依賴注入、攔截器等設計範式,大幅降低開發門檻。這些成果最終匯聚進 EJB 3.0 標準(JSR 220),實現質變。據開發者 Raghu Kodali 實測,將 Sun 官方示例 RosterApp 從 EJB 2.1 遷移至 EJB 3.0,代碼量可減少 50% 以上。
EJB 3.0 最顯著的特徵是大量採用 Java 註解,徹底改變配置方式:
雖然 XML 仍保留部署時覆蓋註解、配置外部資源(如 DataSource)的彈性,但 90% 以上場景純註解即可搞定。
EJB 3.0 以介面為契約,實現鬆耦合服務。一個無狀態會話 Bean 僅需:
@Stateless
public class CalculatorBean implements Calculator {
public double calculate(int start, int end, double growthRate, double saving) {
double tmp = Math.pow(1 + growthRate / 12, 12 * (end - start) + 1);
return saving * 12 * (tmp - 1) / growthRate;
}
}
容器自動管理實例池、生命週期、JNDI 綁定。客戶端只需:
Calculator cal = (Calculator) new InitialContext().lookup(Calculator.class.getName());
double result = cal.calculate(25, 60, 0.08, 1000);
有狀態 Bean(@Stateful)則維護客戶會話狀態,配合 @PostConstruct、@PreDestroy、@PrePassivate、@PostActivate、@Init、@Remove 等生命週期回調,精細控制資源初始化與釋放。
MDB 實現 javax.jms.MessageListener,配合 @MessageDriven 註解指定監聽隊列:
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination", propertyValue="queue/mdb")
})
public class CalculatorMDB implements MessageListener {
@EJB Calculator calculator; // 依賴注入
public void onMessage(Message msg) { /* 解析訊息並委派計算 */ }
}
@EJB、@Resource 一行搞定資源注入,支援欄位注入與 Setter 注入:
@EJB Calculator calc; // 欄位注入
@Resource DataSource myDb; // 注入 DataSource
@Resource(name="queue/A") Queue queue; // 注入 JMS 隊列
@PersistenceContext EntityManager em; // 注入 JPA EntityManager
容器在首次訪問前自動完成賦值,編譯期類型安全,徹底消除字串查找與強制轉型風險。
EJB 3.0 以「約定優於配置」與「註解驅動」雙引擎,將企業級開發從 XML 地獄與樣板代碼泥沼中解脫,讓開發者聚焦業務邏輯。下篇將深入探討 JPA 持久化與實體 Bean 的全新面貌。