3大框架Struts、Hibernate、Spring簡單瞭解
- 基本概念:Spring/Struts/Hibernate是幹嘛用的?
- 三個框架產生的技術歷史背景
- 學習前首先應該掌握的基礎知識
- 學習一個開發框架的基本方法
- 如何學習Spring框架
- 如何學習ORM框架
- 如何學習MVC框架
第一部分:基本概念
首先我們應該瞭解這三個框架分別是做什麼的,在Java開發中具有什麼樣的作用,對於理清楚框架中具體的知識點是大有裨益的。
1. Spring:DI/AOP
Spring對應的關鍵詞是DI(依賴注入)與AOP(面向切面程式設計),可以認為是一個以DI和AOP為核心Java Web一站式的整合(粘合)框架。
其中DI也稱為IoC(控制發轉)用於管理Java物件之間的依賴關係(一定要說DI是IoC實現方式的童鞋們見評論區),AOP用於解耦業務程式碼和公共服務程式碼(如日誌,安全,事務等)。DI和AOP能夠讓程式碼更加簡單,具有良好的鬆耦合特性和可測試性,極大地簡化開發。理解這兩者是使用Spring框架的基礎。
Spring框架對Java企業應用開發中的各類通用問題都進行了良好的抽象,因此也能夠把應用各個層次所涉及的特定的功能和開發框架(如接下來要說的MVC框架、ORM框架)方便得組合到一起(這也得益於依賴注入和麵向切面程式設計帶來的強大功能)。Spring是一個極其優秀的一站式的Full-Stack整合框架,因此基於Spring核心,對Java應用開發中的各類通用問題幾乎都提供了針對性的開發框架,比如你耳熟能詳(如果你對這個問題感興趣的話)的Spring MVC,Spring Data。
Java曾經有另外一個類似的一站式框架粘合框架Seam,這是Hibernate的作者、脾氣火爆的大神Gavin King的作品,核心是基於依賴注入來黏合JSF和EJB,不過推出時Spring已經大殺四方,Seam基本已經退出歷史舞臺了。記得Seam提過一個我認為很不錯的概念:“雙向注入”,類似現在前端框架中的雙向繫結,當時來說還是很超前的。
2. Struts:MVC
Struts是一個Java Web MVC開發框架。MVC早在1978年就作為Smalltalk的一種設計模式被提出來了,引用到Web應用中來時:- 模型Model用於封裝與業務邏輯相關的資料和資料處理方法
- 檢視View是資料的HTML展現
- 控制器Controller負責響應請求,協調Model和View
Model,View和Controller的分開,是一種典型的關注點分離的思想,不僅使得程式碼複用性和組織性更好,使得Web應用的配置性和靈活性更好。
MVC開發模式下,Java Web開發會遇到URL路由、模板渲染、表單繫結/提交/驗證、Session封裝、許可權驗證、國際化等一系列通用的問題,而MVC框架會將這些通用問題都封裝進框架中,你在應用中根據自己的場景進行簡單的配置和編碼即可,MVC框架就能幫你處理好一切,可以極大地簡化程式碼。
看到“MVC框架會幫你處理好一切”,不知你是否知道這句著名的話(印象中出自GoF?):不要呼叫我,我會呼叫你。再扯遠一點,這其實是依賴注入(DI)/控制反轉(IoC)概念的最初來源啊,去看看Martin Fowler的部落格就知道了:)。
Struts曾經是最流行的Java Web MVC框架,現在常見的選擇是Spring MVC。
3. Hibernate:ORM
Hibernate是一個Java ORM開發框架
ORM是Object Relation Mapping的縮寫,顧名思義,即物件關係對映。
ORM是一種以面向物件的方式來進行資料庫操作的技術。Web開發中常用的語言,都會有對應的ORM框架。而Hibernate就是Java開發中一種常用ORM框架,另一個現在流行的ORM框架是Mybatis。
為什麼需要ORM框架?
簡單地理解,通過Java進行資料庫訪問的正常流程可以分為以下幾步:- 準備好SQL語句
- 呼叫JDBC的API傳入SQL語句,設定引數
- 解析JDBC返回的結果
- 在Java程式碼中拼接SQL非常麻煩,而且易於出錯
- JDBC的程式碼呼叫有很多重複性的程式碼
- 從JDBC返回的結果轉換成領域模型的Java物件很繁瑣
而使用ORM框架,則可以讓我們用面向物件的方式來操作資料庫,比如通過一個簡單的函式呼叫就完成上面整個流程,直接返回對映為Java物件的結果。這個流程中很大一部分工作其實可以交給ORM自動化地幫我們執行。對,類似MVC框架,ORM框架會幫你處理好相關的繁瑣事情!
第二部分. 三個框架產生的技術歷史背景
SSH是Java Web開發的技術框架,我們簡單回顧一下Web應用的發展。
1991年Web頁面在Internet上的首次登場,最早Web主要被一幫科學家們用來共享和傳遞資訊,瀏覽器中主要展現的是靜態的文字或影象資訊。不過大家很快就不僅僅滿足於訪問放在Web伺服器上的靜態檔案,1993年CGI(Common Gateway Interface)出現了,CGI定義了Web伺服器與外部應用程式之間的通訊介面標準,因此Web伺服器可以通過CGI執行外部程式,讓外部程式根據不同的Web請求生成動態內容。而在Java Web開發中的Servlet,其原理與CGI是類似的。
那個時候編寫CGI程式的主要是Perl和C等語言,在程式中輸出大片的HTML字串,可讀性和維護性是個大問題。為了處理更復雜的應用,一種方法是把HTML頁面中固定的部分存起來(稱之為模版),把動態部分打上標記,處理Web請求時,後端程式生成動態的內容然後填充進到模板中去,形成最終返回的HTML。於是1994年PHP誕生了,PHP可以把程式(動態內容)嵌入到HTML(模版)中,不僅能更好的組織Web應用的內容,而且執行效率比CGI還更高。之後96年出現的ASP和98年出現的JSP本質上也都可以看成是一種支援某種指令碼語言程式設計(分別是VB和Java)的模版引擎。
Web開發指令碼語言,搭配上後端資料庫技術,Web開始大殺四方,類似電子商務系統這樣的複雜應用也開始出現在網際網路上。如第一部分所述,這時MVC的概念被引入到Web開發中來了。這時一個典型的Java Web應用從架構上看起來應該是這個樣子:
- Web瀏覽器傳送HTTP請求到服務端,被Controller(Servlet)獲取並進行處理(例如引數解析、請求轉發)
- Controller(Servlet)呼叫核心業務邏輯——Model部分
- Model進行資料庫存取操作,並將操作結果返回給Model
- Controller(Servlet)將業務邏輯處理結果交給View(JSP),動態輸出HTML內容
- 動態生成的HTML內容返回到瀏覽器顯示
接下來就該MVC框架(以Spring MVC為例)和ORM粉墨登場了:
Spring MVC提供了一個DispacherServlet(可以Spring MVC是以Servlet技術為基礎的),這個Servlet把Web應用中Servlet中經常要實現的功能封裝起來並提供一層公共抽象,想象對應於一個Web請求後端要做的事情,比如:
- URL對映(對應HTTP URL和方法,應該呼叫什麼程式碼)
- 許可權驗證(當前的URL是否允許當前使用者訪問)
- 引數解析(如何從Servlet中獲得引數)
- 資料繫結(如何將Servlet中的引數,繫結到業務邏輯物件中)
- 資料驗證(判斷資料是否符合業務規則,比如郵件格式是否正確)
- 檢視解析(使用哪個檢視模板進行渲染)
- 模型傳遞與檢視渲染(將資料傳遞給模板,並且在模板中引用)
- ...
有了Spring MVC,你只需寫簡單的POJO程式碼(如圖所示,用POJO實現Controller),或者實現Spring MVC給你提供的介面(比如實現Interceptor做許可權判斷),就能完成這些繁瑣的功能。
POJO是Plain Old Java Object的縮寫,是軟體開發大師Martin Fowler提出的一個概念,指的是一個普通Java類。也就說,你隨便編寫一個Java類,就可以稱之為POJO。之所以要提出這樣一個專門的術語,是為了與基於重量級開發框架的程式碼相區分,比如EJB,我們編寫的類一般都要求符合特定編碼規範,實現特定介面、繼承特定基類,而POJO則可以說是百無禁忌,靈活方便。
而ORM的作用就非常直觀了,無須贅述,如圖所示它提供了與資料庫操作的一層中間抽象,這樣Model的程式碼自然會更加簡單。Spring MVC基本可以幫你遮蔽Servlet的API,ORM則可以幫你遮蔽JDBC的API了,也就是說你在更高的抽象層次上寫程式了,更高的抽象層次一般意味著以更符合我們思維的方式來思考,自然效率更高。這事實上是軟體技術發展的一個重要驅動力之一。你想想,從組合語言發展出高階語言,從檔案系統發展出資料庫,其實本質規律是類似的。
那Spring的作用是什麼呢? 看到圖中大量的箭頭沒有?
圖中的每一個小方塊其實都是大量的Java類來實現,Controller與Model之間,Model與資料訪問物件之間的這些箭頭,意味這些Java類之間存在大量複雜的依賴關係。Spring的核心功能依賴注入,正是用於管理Java物件之間的依賴關係,所以第一部分我們說Spring是一個一站式的粘合框架,它像神奇的膠水一樣,可以以鬆耦合的方式有機的粘合在一起。那具體怎麼做到的呢?後文分解。
回到歷史,Web開始大殺四方之時,大型應用在分散式、安全性、事務性等方面的要求進一步催生了J2EE(現在已更名為Java EE)平臺在1999年的誕生。但是J2EE的元件技術EJB(Enterprice Java Beans)非常笨重,Spring的初衷是為了替代EJB,讓Java EE開發更加簡單靈活。它起源於Rod Jahnson 2002年出版的著作《Expert One-on-One J2EE Design and Development》,那本書中分析了Java EE的開發效率和實際效能等方面的問題,從實踐和架構的角度探討了簡化開發的原則和方法。以此為基礎,他實現了一個名為interface21的輕量級開發框架,成為Spring框架的前身。2004年,Spring正式釋出1.0版本,同年Rod Jahnson推出了另一部影響深遠的經典著作《Expert one-on-one J2EE Development without EJB》,Spring開始逐步在Java領域流行。現在Spring框架的版本已經演化到了4.x,它已經成為Java開發框架的一種事實標準,對Java EE規範本身也產生了重要影響。比如EJB規範就在發展中逐漸引入了眾多Spring框架的優秀特徵。
好了,你現在應該可以從更高和更廣的技術視野來看待這幾個框架了吧。看到一門技術的發規律和發展歷程,這是一種技術修養的體現,跟人文修養是類似。但是同時我們也應該具有一定的深度,因為我們往往已經站在比較高的抽象層次,比如今天你寫幾行程式碼就能把資料庫建立好,增刪改查的功能也自動生成好了,但是成為高手需要你對底層的原理機制有更透徹的理解,真正遇到問題的時候才能抽絲剝繭迎刃而解。所以要看第三部分:需要了解的基礎知識。