在Struts + Spring + Hibernate的組合框架模式中三者各自的特點都是什麼?
Struts 的MVC設計模式可以使我們的邏輯變得很清晰
Spring 的IOC和AOP可以使我們的產品在最大限度上解藕
hibernate的當然就是實體對象的持久化了
典型的JEE三層結構分為表現層中間層(業務邏輯層)和數據服務層三層體系將業務規則數據訪問及合法性校驗等工作放在中間層處理客戶端不直接與數據庫交互而是通過組件與中間層建立連接再由中間層與數據庫交互
表現層是傳統的JSP技術自年問世以來經過多年的發展其廣泛的應用和穩定的表現為其作為表現層技術打下了堅實的基礎
中間層采用的是流行的Spring+Hibernate為了將控制層與業務邏輯層分離又細分為以下幾種
Web層就是MVC模式裡面的C(controller)負責控制業務邏輯層與表現層的交互調用業務邏輯層並將業務數據返回給表現層作組織表現該系統的MVC框架采用Struts
Service層(就是業務邏輯層)負責實現業務邏輯業務邏輯層以DAO層為基礎通過對DAO組件的正面模式包裝完成系統所要求的業務邏輯
DAO層負責與持久化對象交互該層封裝了數據的增刪查改的操作
PO持久化對象通過實體關系映射工具將關系型數據庫的數據映射成對象很方便地實現以面向對象方式操作數據庫該系統采用Hibernate作為ORM框架
Spring的作用貫穿了整個中間層將Web層Service層DAO層及PO無縫整合其數據服務層用來存放數據
一個良好的框架可以讓開發人員減輕重新建立解決復雜問題方案的負擔和精力它可以被擴展以進行內部的定制化並且有強大的用戶社區來支持它框架通常能很好的解決一個問題然而你的應用是分層的可能每一個層都需要各自的框架僅僅解決UI問題並不意味著你能夠很好的將業務邏輯和持久性邏輯和UI 組件很好的耦合
不可否認對於簡單的應用采用ASP或者PHP的開發效率比采用JEE框架的開發效率要高甚至有人會覺得這種分層的結構比一般采用JSP + Servlet的系統開發效率還要低
筆者從一下幾個角度來闡述這個問題
開發效率軟件工程是個特殊的行業不同於傳統的工業例如電器建築及汽車等行業這些行業的產品一旦開發出來交付用戶使用後將很少需要後續的維護但軟件行業不同軟件產品的後期運行維護是個巨大的工程單純從前期開發時間上考慮其開發效率是不理智的也是不公平的眾所周知對於傳統的ASP和 PHP等腳本站點技術將整個站點的業務邏輯和表現邏輯都混雜在ASP或PHP頁面裡從而導致頁面的可讀性相當差可維護性非常低即使需要簡單改變頁面的按鈕也不得不打開頁面文件冒著破壞系統的風險但采用嚴格分層JEE架構則可完全避免這個問題對表現層的修改即使發生錯誤也絕對不會將錯誤擴展到業務邏輯層更不會影響持久層因此采用JEE分層架構即使前期的開發效率稍微低一點但也是值得的
需求的變更以筆者多年的開發經驗來看很少有軟件產品的需求從一開始就完全是固定的客戶對軟件需求是隨著軟件開發過程的深入不斷明晰起來的因此常常遇到軟件開發到一定程度時由於客戶對軟件需求發生了變化使得軟件的實現不得不隨之改變當軟件實現需要改變時是否可以盡可能多地保留軟件的部分盡可能少地改變軟件的實現從而滿足客戶需求的變更?答案是采用優秀的解耦架構這種架構就是JEE的分層架構在優秀的分層架構裡控制層依賴於業務邏輯層但絕不與任何具體的業務邏輯組件耦合只與接口耦合同樣業務邏輯層依賴於DAO層也不會與任何具體的DAO組件耦合而是面向接口編程采用這種方式的軟件實現即使軟件的部分發生改變其他部分也盡可能不要改變
注意即使在傳統的硬件行業也有大量的接口規范例如PCI接口顯卡或者網卡只要其遵守PCI的規范就可以插入主板與主板通信至於這塊卡內部的實現不是主板所關心的這也正是面向接口編程的好處假如需要提高電腦的性能需要更新顯卡只要更換另一塊PCI接口的顯卡而不是將整台電腦拋棄如果一台電腦不是采用各種接口組合在一起而是做成整塊那將意味著即使只需要更新網卡也要放棄整台電腦同樣對於軟件中的一個個組件當一個組件需要重構時盡量不會影響到其他組件實際上這是最理想的情況即使采用目前最優秀的架構也會有或多或少的影響這也是軟件工程需要努力提高的地方
技術的更新系統重構軟件行業的技術更新很快雖然軟件行業的發展不快但小范圍的技術更新特別快一旦由於客觀環境的變化不得不更換技術時如何保證系統的改變最小呢?答案還是選擇優秀的架構
在傳統的Model 的程序結構中只要有一點小的需求發生改變將意味著放棄整個頁面或者改寫雖然前期的開發速度快除非可以保證以後永遠不會改變應用的結構否則不要采用Model 的結構
采用Hibernate作為持久層技術的最大的好處在於可以完全以面向對象的方式進行系統分析系統設計
DAO模式需要為每個DAO組件編寫DAO接口同時至少提供一個實現類根據不同需要可能有多個實現類用Spring容器代替DAO工廠
通常情況下引入接口就不可避免需要引入工廠來負責DAO組件的生成Spring實現了兩種基本模式單態模式和工廠模式而使用Spring可以完全避免使用工廠模式因為Spring就是個功能非常強大的工廠因此完全可以讓Spring充當DAO工廠
由Spring充當DAO工廠時無須程序員自己實現工廠模式只需要將DAO組件配置在Spring容器中由ApplicationContext負責管理DAO組件的創建即可借助於Spring提供的依賴注入其他組件甚至不用訪問工廠一樣可以直接使用DAO實例
優點
Struts跟TomcatTurbine等諸多Apache項目一樣是開源軟件這是它的一大優點使開發者能更深入的了解其內部實現機制
除此之外Struts的優點主要集中體現在兩個方面Taglib和頁面導航Taglib是Struts的標記庫靈活動用能大大提高開發效率另外就目前國內的JSP開發者而言除了使用JSP自帶的常用標記外很少開發自己的標記或許Struts是一個很好的起點
關於頁面導航我認為那將是今後的一個發展方向事實上這樣做使系統的脈絡更加清晰通過一個配置文件即可把握整個系統各部分之間的聯系這對於後期的維護有著莫大的好處尤其是當另一批開發者接手這個項目時這種優勢體現得更加明顯
缺點
Taglib是Struts的一大優勢但對於初學者而言卻需要一個持續學習的過程甚至還會打亂你網頁編寫的習慣但是當你習慣了它時你會覺得它真的很棒
Struts將MVC的Controller一分為三在獲得結構更加清晰的同時也增加了系統的復雜度
Struts從產生到現在還不到半年但已逐步越來越多運用於商業軟件雖然它現在還有不少缺點但它是一種非常優秀的JEE MVC實現方式如果你的系統准備采用JEE MVC架構那麼不妨考慮一下Struts
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28889.html