Java EE 生態歷經 EJB 2.x 重型痛苦、Spring/Hibernate 輕量崛起、EJB 3.x/JPA 標準化回歸。本文從表現層、業務層、持久層三維度,對比主流框架技術細節、適用場景與遷移路徑,助力架構師根據專案規模、團隊能力、非功能需求做理性選型。
| 類別 | 代表 | 核心特徵 | 典型適用 |
|---|---|---|---|
| 重量級 (標準型) | EJB 3.x / JPA / JSF | 應用伺服器管理生命週期、事務、安全、叢集;標準化、廠商中立 | 大型任務關鍵系統、銀行核心、電信計費、需嚴格合規環境 |
| 輕量級 (開源型) | Spring + Hibernate/MyBatis + Struts/JSF | POJO 開發、IoC/AOP 解耦、可獨立運行於 Servlet 容器、生態豐富 | 中小型專案、敏捷迭代、雲原生微服務、團隊熟悉 Spring 生態 |
| 框架 | 架構風格 | 組件模型 | 頁面跳轉 | 事件粒度 | 學習曲線 |
|---|---|---|---|---|---|
| Struts 2 | Action 驅動 | Action + Interceptor | struts.xml 配置 result | Form 級 | 中 |
| JSF 2.x | 元件驅動 | Facelets + Managed Bean | faces-config.xml / 隱式導航 | 元件/欄位級 (AJAX) | 陡峭 |
| Tapestry 5 | 元件驅動 | Page/Component 類 + 模板 | 頁面類名約定 | 元件級 | 高 |
| Spring MVC | Controller 驅動 | @Controller + @RequestMapping | ViewResolver 邏輯視圖名 | 請求級 | 平緩 |
建議:新專案優先 Spring MVC 或 Spring Boot WebFlux;維護舊 Struts/JSF 專案按現狀演進。
| 維度 | EJB 3.x | Spring |
|---|---|---|
| 容器依賴 | 需 Java EE 完整容器 | 可運行於 Tomcat/Jetty/獨立 JVM |
| 事務管理 | 容器管理 (CMT) + BMT,分散式 JTA 內建 | 聲明式 @Transactional,需額外配置 JTA (Atomikos/Bitronix) 才支援分散式 |
| 依賴注入 | @Inject / @EJB (CDI) | @Autowired / @Inject (Spring IoC) |
| AOP 支援 | 攔截器 | 完整 AOP 聯切點/通知/切面 |
| 叢集/容錯 | 容器級叢集、Session 複製 | 需外掛 (Spring Session、Redis、Hazelcast) |
| 開發效率 | 熱部署較慢、啟動慢 | Spring Boot DevTools 秒級重啟 |
| 遷移成本 | 標準化,理論可移植 | 生態鎖定風險,但社區支援極強 |
沒有銀彈,只有權衡。輕量級不等於簡單,重量級不等於笨重。EJB 3.x 已大幅簡化,Spring 也吸收了許多 JEE 標準。關鍵在於:團隊能否駕馭所選技術的複雜度,並隨業務演進持續交付價值。