Struts1、Struts2、Hibernate、Spring框架工作原理介紹

taozihk發表於2016-05-18

Struts1工作原理

Struts1工作原理圖

1、初始化:struts框架的總控制器ActionServlet是一個Servlet,它在web.xml中配置成自動啟動的Servlet,在啟動時總控制器會讀取配置檔案(struts-config.xml)的配置資訊,為struts中不同的模組初始化相應的物件。(物件導向思想)
 
2、傳送請求:使用者提交表單或通過URLWEB伺服器提交請求,請求的資料用HTTP協議傳給web伺服器。
 
3form填充:struts的總控制器ActionServlet在使用者提交請求時將資料放到對應的form物件中的成員變數中。
 
4、派發請求:控制器根據配置資訊物件ActionConfig將請求派發到具體的Action,對應的formBean一併傳給這個Action中的excute()方法。
 
5、處理業務:Action一般只包含一個excute()方法,它負責執行相應的業務邏輯(呼叫其它的業務模組)完畢後返回一個ActionForward物件。伺服器通過ActionForward物件進行轉發工作。
 
6、返回響應:Action將業務處理的不同結果返回一個目標響應物件給總控制器。
 
7、查詢響應:總控制器根據Action處理業務返回的目標響應物件,找到對應的資源物件,一般情況下為jsp頁面。
 
8、響應使用者:目標響應物件將結果傳遞給資源物件,將結果展現給使用者。
Struts1優缺點(為什麼要用strust1
1.優點: 
  ①開源的框架,結構清晰 
  ②MVC的經典實現(MVC是一種思想,而不是一種技術) 
  ③處理異常機制,實現國際化 
  ④具有強大的標籤庫 
  ⑤解決了JSP頁面存在大量的JAVA程式碼,維護起來方便 
  ⑥formBean中會自動提交,不會去使用傳統的getset方法得到值、取值 

2.缺點: 
  ①配置複雜 
  ②測試不方便 
  ③依賴web容器 
  ④action是一個單例模式,必須設定為執行緒安全 


Struts2工作原理

struts2工作原理圖

客戶端初始化一個指向Servlet容器(例如Tomcat)的請求 
這個請求經過一系列的過濾器(Filter(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其他框架的整合很有幫助,例如:SiteMesh Plugin) 
接著FilterDispatcher被呼叫,FilterDispatcher詢問ActionMapper來決定這個請是否需要呼叫某個Action 
如果ActionMapper決定需要呼叫某個ActionFilterDispatcher把請求的處理交給ActionProxy 
5 ActionProxy通過Configuration Manager詢問框架的配置檔案,找到需要呼叫的Action類 
6 ActionProxy建立一個ActionInvocation的例項。 
7 ActionInvocation例項使用命名模式來呼叫,在呼叫Action的過程前後,涉及到相關攔截器(Intercepter)的呼叫。 
一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可 能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2 框架中繼承的標籤。在這個過程中需要涉及到ActionMapper 

在上述過程中所有的物件(ActionResultsInterceptors,等)都是通過ObjectFactory來建立的
Struts2優缺點(即為什麼要用struts2
Struts2就會自動的進行驗證。還有很多,比如國際化資原始檔等。 
Struts2的開發中來,如果你重來沒有用過任何框架,你也可以通過快速的學習,加入到Struts2的應用開發中來,因為它足夠的簡單。 
大量的攔截器:
Struts2本身提供了大量的可重用的攔截器,比如型別轉換攔截器,很多時候我們從頁面取得引數,這個時候它是String型別的,我們需要手動。
基於外掛的框架:
Struts2是一個基於外掛的框架,社群中提供了很多實用的外掛,比如jfreechat/json等等,使用這些外掛可以簡化我們的開發,加快開發進度。
struts2最大的缺點莫過於在好多web伺服器上支援不好,例如在websphere5.5,weblogic8.1及以前版本支援非常查,需要用最新的。
多種檢視的支援:
多種檢視的支援:jspfreemarkerVeloctiy,只要你願意,你甚至可以通過輕鬆的改造讓它支援pdf,同一個專案中你可以支援多種檢視。
更加的模組化:
Struts1.X 相比,Struts2更加的模組化,可以輕鬆將配置資訊按功能界限拆分成多個檔案,便於管理和團隊協作開發。
Spring的整合:
Struts1.x相比,Struts2不必再自己編寫singleton,進一步的降低了程式間的耦合性,就Struts2內部本身而言,降低了框架本身的偶合性。
基於pojo易於測試:
Struts1.x中我需要Mock出這兩個Http物件,使我們很難編寫Action的單元測試,與Struts1.x相比,Struts2Action 不再依賴於HttpServletRequestHttpServletResponse物件,使我們能夠更方便的針對Action編寫單元測試。

 


Hibernate工作原理

1. 讀取並解析配置檔案
2. 讀取並解析對映資訊,建立SessionFactory
3. 開啟Sesssion
4. 建立事務Transation
5. 持久化操作
6. 提交事務
7. 關閉Session
8. 關閉SesstionFactory

Hibernate優缺點
優點: 
1: hibernate是基於ORMapping技術的開源的框架,對JDBC進行了輕量級的封裝,使用物件導向的思維來操縱資料庫。 
2hibernate提供了session快取和二級快取,對於不需要進行復雜查詢的系統,效能有提升。 
3:低侵入式設計 

缺點: 
1hibernate學習成本太高。 
2:不適合有複雜的sql查詢(統計) 。 
3:不適合大量的聚集操作,(儲存過程)
優缺點補充:
1、 不需要編寫的SQL語句(不需要編輯JDBC),只需要操作相應的物件就可以了,就可以能夠儲存、更新、刪除、載入物件,可以提高生產效; 
2、因為使用Hibernate只需要操作物件就可以了,所以我們的開發更物件化了; 
3使用Hibernate,移植性好(只要使用Hibernate標準開發,更換資料庫時,只需要配置相應的配置檔案就可以了,不需要做其它任務的操作); 
4Hibernate實現了透明持久化當儲存一個物件時,這個物件不需要繼承Hibernate中的任何類、實現任何介面,只是個純粹的單純物件稱為POJO物件(最純粹的物件這個物件沒有繼承第三方框架的任何類和實現它的任何介面
5Hibernate是一個沒有侵入性的框架,沒有侵入性的框架我們一般稱為輕量級框架 
6Hibernate程式碼測試方便。


Spring工作原理

內部最核心的就是IOC了, 

動態注入,讓一個物件的建立不用new了,可以自動的生產,這其實就是利用java裡的反射,反射其實就是在執行時動態的去建立、呼叫物件,Spring就是在執行時,跟xml Spring

的配置 檔案來動態的建立物件,和呼叫物件裡的方法的 。 

Spring還有一個核心就是AOP這個就是面向切面程式設計,可以為某一類物件 進行監督和控制(也就是 在呼叫這類物件的具體方法的前後去呼叫你指定的 模組)從而達到對一個

模組擴充的功能。這些都是通過 配置類達到的。 

Spring目的:就是讓物件與物件(模組與模組)之間的關係沒有通過程式碼來關聯,都是通過配置類說明 管理的(Spring根據這些配置 內部通過反射去動態的組裝物件) 

要記住:Spring是一個容器,凡是在容器裡的物件才會有Spring所提供的這些服務和功能。 

Spring裡用的最經典的一個設計模式就是:模板方法模式。(這裡我都不介紹了,是一個很常用的設計模式) 

Spring裡的配置是很多的,很難都記住,但是Spring裡的精華也無非就是以上的兩點,把以上兩點跟理解了 也就基本上掌握了Spring.


Spring AOPIOC
一、 IoC(Inversion of control): 控制反轉 
1IoC: 

概念:控制權由物件本身轉向容器;由容器根據配置檔案去建立例項並建立各個例項之間的依賴關係 

核心:bean工廠;在Spring中,bean工廠建立的各個例項稱作bean 

二、AOP(Aspect-Oriented Programming): 面向方面程式設計 
1、 代理的兩種方式: 
靜態代理: 
  • 針對每個具體類分別編寫代理類
  • 針對一個介面編寫一個代理類
動態代理: 

針對一個方面編寫一個InvocationHandler,然後借用JDK反射包中的Proxy類為各種介面動態生成相應的代理類


Spring 優缺點

它是一個開源的專案,而且目前非常活躍;它基於IoCInversion of Control,反向控制)和AOP的構架多層j2ee系統的框架,但它不強迫你必須在每一層 中必須使用Spring,因為它模組化的很好,允許你根據自己的需要選擇使用它的某一個模組;它實現了很優雅的MVC,對不同的資料訪問技術提供了統一的 介面,採用IoC使得可以很容易的實現bean的裝配,提供了簡潔的AOP並據此實現Transcation Managment,等等
優點 

  1.  Spring能有效地組織你的中間層物件,不管你是否選擇使用了EJB。如果你僅僅使用了Struts或其他為J2EE的 API特製的frameworkSpring致力於解決剩下的問題。 
  2. Spring能消除在許多工程中常見的對Singleton的過多使用。根據我的經驗,這是一個很大的問題,它降低了系統的可測試性和麵向物件的程度。 
  3. 通過一種在不同應用程式和專案間一致的方法來處理配置檔案,Spring能消除各種各樣自定義格式的屬性檔案的需要。曾經對某個類要尋找的是哪個魔法般的屬性項或系統屬
  4. 性感到不解,為此不得不去讀Javadoc甚至源編碼?有了Spring,你僅僅需要看看類的JavaBean屬性。Inversion of Control的使用(在下面討論)幫助完成了這種簡化。 
  5. 通過把對介面程式設計而不是對類程式設計的代價幾乎減少到沒有,Spring能夠促進養成好的程式設計習慣。 
  6. Spring被設計為讓使用它建立的應用盡可能少的依賴於他的APIs。在Spring應用中的大多數業務物件沒有依賴於Spring。 
  7. 使用Spring構建的應用程式易於單元測試。 
  8. Spring能使EJB的使用成為一個實現選擇,而不是應用架構的必然選擇。你能選擇用POJOslocal EJBs來實現業務介面,卻不會影響呼叫程式碼。 
  9. Spring幫助你解決許多問題而無需使用EJBSpring能提供一種EJB的替換物,它們適用於許多web應用。例如,Spring能使用AOP提供宣告性事務管理而不通過EJB容器,如果你僅僅需要與單個資料庫打交道,甚至不需要一個JTA實現。 
  10. Spring為資料存取提供了一個一致的框架,不論是使用的是JDBC還是O/R mapping產品(如Hibernate)。 

Spring確實使你能通過最簡單可行的解決辦法來解決你的問題。而這是有有很大價值的。

相關文章