在 J2EE 黃金時代,Struts、Spring、Hibernate (SSH) 以及 Spring、SpringMVC、iBATIS (SSI) 無疑是企業級開發的基石。它們融合了大師級的設計模式,極大降低了入門門檻,規範了開發流程,提升了生產效率。然而,任何工具的過度依賴都會成為思維的牢籠。
「XX 天精通 XX」類書籍讓零基礎者快速上崗,短期解決了就業問題,長期卻培養了「用時再學、知其然不知其所以然」的投機心態。大量開發者停留在 API 調用層面,對算法、數據結構、JVM 原理、網絡協議等底層知識一無所知。
企業為了管控風險,將「最佳實踐」固化為「強制規範」:
반드시寫 Action、Service 接口、ServiceImpl、DAO 接口、DAOImpl…
無論業務多麼簡單,五層架構一行不少。久而久之,開發者以為「Web 開發就該這樣寫」,失去了架構選型的判斷力。
見到釘子就用錘子,簡單的 CRUD 硬套工廠、代理、模板方法,導致代碼層層包裹、調用鏈極長,維護成本劇增。
以經典的 MVC 分層為例:
錯誤現象:
❌ Controller 寫業務邏輯
❌ Service 直接操作數據庫
❌ DAO 包含業務判斷
❌ 新增功能 = 照抄舊代碼改字段,完全不考慮復用
| 層級 | 核心職責 | 禁忌 |
|---|---|---|
| Controller | 請求接收、參數校驗、服務編排、響應封裝 | 業務邏輯、直接 DB 操作 |
| Service | 業務邏輯實現、事務控制、領域模型操作 | HTTP 相關、SQL 拼接 |
| DAO | 數據訪問、SQL 執行、結果映射 | 業務判斷、跨表複雜邏輯 |
需求像異形建築,兩種建造方式:
🅰 整體澆築:一次性寫死,下次重寫 → 技術債務指數級增長
🅱 積木拼裝:拆解為通用模塊(方法、類、組件),新需求 = 現有積木 + 少量膠水代碼
Service 應該是領域服務的組合,而非單一巨大的事務腳本。Controller 編排多個細粒度 Service,Service 組合多個 DAO/Repository 操作。
分層本質是依賴倒置與關注點分離,而非死板的層數。
業務簡單時:Controller → Service → Repository (三層足矣)
業務複雜時:引入 Domain Service、Application Service、Facade、DTO 轉換層…
架構服務於業務,而非業務服務於架構。
工具越先進,越考驗使用者的基本功。
C 程序員轉 Java 容易,Java 轉 C 難,因為前者習慣了現成的輪子,後者習慣了親手造輪子。
中庸 ≠ 平庸,過猶不及,在框架便利與技術深度間找到平衡,才是資深工程師的必修課。