| 測試層級 | 工具 | 驗證重點 |
| 實體/DAO |
JUnit + DBUnit / Testcontainers |
映射正確性、查詢語義、事務邊界 |
| Service/EJB |
JUnit + Mockito / Arquillian |
業務規則、事務傳播、異常轉換 |
| Controller |
Spring MVC Test / Cactus |
請求綁定、驗證、視圖解析、導航 |
| 整合/契約 |
RestAssured / Pact |
API 契約、跨服務協作 |
GUI 測試粒度粗、執行慢、維護貴,僅作驗收測試補充。
4. 依規範開發,不依應用服務器 —— 可移植性鐵律
- 安全:使用 JAAS / Servlet 安全規範,勿自建認證體系
- 事務:使用 CMT(容器管理事務)+ JTA,勿手工控制
UserTransaction
- 持久化:JPA / JDBC 標準 API,勿直接用廠商擴展
- 通訊:JMS / WebSocket / JAX-RS,勿自造 RPC 協議
- 例外:規範確無解決方案時,優先用廠商方案(如 WebSphere Scheduler),並隔離在適配層
安全與效能層面(5-12)
5. 專案啟動即啟用 Java EE 安全 —— 不可妥協
WebSphere / WildFly / Liberty 內建安全基礎設施經過實戰檢驗,自建安全體系幾乎必有漏洞。若角色模型粒度不足,採用「Java EE 認證 + 業務層授權擴展」混合模式。
6. 漸進式模組構建 —— 從簡單域模型開始
- 領域模型 + JDBC 持久化 → 測試通過
- 疊加 Servlet/JSP 前端 → 驗證 MVC 協作
- 引入 EJB / Spring 事務與安全 → 驗證容器服務
- 最後加入 JMS、Web Service 等進階特性
採用 XP「最後責任時刻」原則,推遲不可逆決策。
7. EJB 必用 Session Facade + Local Interface
- Facade 定義粗粒度業務邊界,單次呼叫完成完整業務單元
- Local Interface 消除序列化開銷,同 JVM 內調用零拷貝
- Facade 本身暴露 Remote Interface,支援遠端客戶端與 Web Service 發布(JSR-109)
8. 無狀態 Session Bean 取代有狀態 —— 可擴展性鐵律
- 有狀態 Bean 綁定伺服器實例,阻礙叢集負載均衡
- 用戶會話狀態存
HttpSession(叢集可複寫)或資料庫
- 緩存唯讀數據用二級快取(Ehcache/Infinispan)
9. 容器管理事務 (CMT) + 兩階段提交 (2PC) —— 數據一致性底線
- 聲明式事務邊界(
@TransactionAttribute / ejb-jar.xml),業務代碼零侵入
- 跨資源(JMS + DB、多 DB)操作強制 2PC,防止「訊息已消費但 DB 未更新」不一致
- 避免應用層補償邏輯(極難處理崩潰恢復場景)
10. JSP 為首選視圖技術,XML/XSLT 專用於多格式輸出
JSP 2.0+ JSTL + 標籤庫 + EL 表達式已足夠實現零 Java 代碼視圖。XSLT 圖靈完備反而誘導開發者在視圖層寫業務邏輯。
11. HttpSession 輕量化原則
- 單 Session 建議 < 4KB,僅存「當前業務必需」狀態
- 大對象(報表、列表)用快取 + Session 存 Key
- 強制啟用 Session 持久化/複寫,支援故障轉移無感知
12. 善用應用服務器零代碼優化特性
| 特性 | 效果 | 啟用方式 |
| 動態快取 (Dynacache) |
Servlet/JSP 片段快取,吞吐提升 10%+ |
cachespec.xml 聲明式配置 |
| PreparedStatement 快取 |
消除重複 SQL 編譯,JDBC 效能大增 |
DataSource 屬性 statementCacheSize |
| ESI / FRCA / Edge 快取 |
全鏈路靜態化,讀密集型極致加速 |
IHS / WebSphere Plugin 配置 |
部署與運維層面(13-19)
13. 交付標準 EAR + 可讀腳本,拒絕黑盒安裝程式
生產環境常共享單元運行多應用,安裝過程必須可審計、可驗證、可回滾。
14. 設計面向 Network Deployment 叢集
- 無共享狀態、Session 外部化、定時任務分布式協調(Quartz + DB 鎖)
- 驗證清單:啟動順序無依賴、資源引用 JNDI 化、無本地檔案系統依賴
15. 真正運行於容器內,而非借殼運行
警惕「Servlet 僅作代理,核心邏輯在外部守護進程」反模式——喪失容器所有服務品質(安全、事務、監控、叢集)。
16. 規劃版本升級生命週期
- Fix Pack:內部專案半年一升,ISV 必須支援多 Fix Pack 並行
- 大版本:納入成本模型,ISV 必須承諾跟進新版本
- 採用「向上相容 Fix Pack」策略,降低矩陣測試成本
17. 關鍵路徑標準化日誌 —— JDK Logging / Log4j2 / SLF4J
- 記錄點:方法進出、參數傳遞、狀態轉換、異常捕獲、外部呼叫
- 整合 WebSphere Trace 子系統,支援動態調整日誌級別
18. 資源嚴格歸還 —— 杜絕記憶體洩漏
// 模板模式強制關閉
try (Connection conn = ds.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
// 業務邏輯
} // 自動關閉,無需 finally
連接池、線程池、快取條目——所有借用必須歸還。
19. 嚴守開發流程 —— 敏捷不等於無序
- 選定單一流程(Scrum / XP / RUP / OpenUP)並深度定製
- 禁止頻繁切換流程(單專案內從 RUP→XP→Kanban 是大忌)
- 團隊共識 > 流程教條,但必須「理解、執行、適配」三步到位
總結:最佳實踐優先級矩陣
| 優先級 | 實踐編號 | 理由 |
| P0 (立即落地) |
1, 3, 4, 5, 9, 18 |
架構根基、資料安全、資源洩漏——違者必死 |
| P1 (首個迭代) |
2, 6, 7, 8, 11, 17 |
工程效能、可擴展性、可觀測性 |
| P2 (架構演進期) |
10, 12, 13, 14, 15, 16, 19 |
部署標準、叢集就緒、長期維護 |
這 19 條實踐非理論推演,而是數百個企業級專案血淚凝練。逐條落地,Java EE 專案成功率將顯著提升。
- 上一篇文章: Hibernate 基礎映射:一對一外鍵關聯單向映射速成
- 下一篇文章: Eclipse 3.4 Ganymede 安裝 Subclipse 與 Subversive 完整避坑指南
Copyright ©
程式碼之家 All Rights Reserved