SpringMVC工做原理

SpringMVC的工做原理圖:html

SpringMVC流程

一、  用戶發送請求至前端控制器DispatcherServlet。前端

二、  DispatcherServlet收到請求調用HandlerMapping處理器映射器。java

三、  處理器映射器找到具體的處理器(能夠根據xml配置、註解進行查找),生成處理器對象及處理器攔截器(若是有則生成)一併返回給DispatcherServlet。程序員

四、  DispatcherServlet調用HandlerAdapter處理器適配器。web

五、  HandlerAdapter通過適配調用具體的處理器(Controller,也叫後端控制器)。spring

六、  Controller執行完成返回ModelAndView。編程

七、  HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet。後端

八、  DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器。設計模式

九、  ViewReslover解析後返回具體View。緩存

十、DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中)。

十一、 DispatcherServlet響應用戶。

組件說明:

如下組件一般使用框架提供實現:

DispatcherServlet:做爲前端控制器,整個流程控制的中心,控制其它組件執行,統一調度,下降組件之間的耦合性,提升每一個組件的擴展性。

HandlerMapping:經過擴展處理器映射器實現不一樣的映射方式,例如:配置文件方式,實現接口方式,註解方式等。 

HandlAdapter:經過擴展處理器適配器,支持更多類型的處理器。

ViewResolver:經過擴展視圖解析器,支持更多類型的視圖解析,例如:jsp、freemarker、pdf、excel等。

組件:
一、前端控制器DispatcherServlet(不須要工程師開發),由框架提供
做用:接收請求,響應結果,至關於轉發器,中央處理器。有了dispatcherServlet減小了其它組件之間的耦合度。
用戶請求到達前端控制器,它就至關於mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它調用其它組件處理用戶的請求,dispatcherServlet的存在下降了組件之間的耦合性。

二、處理器映射器HandlerMapping(不須要工程師開發),由框架提供
做用:根據請求的url查找Handler
HandlerMapping負責根據用戶請求找到Handler即處理器,springmvc提供了不一樣的映射器實現不一樣的映射方式,例如:配置文件方式,實現接口方式,註解方式等。

三、處理器適配器HandlerAdapter
做用:按照特定規則(HandlerAdapter要求的規則)去執行Handler
經過HandlerAdapter對處理器進行執行,這是適配器模式的應用,經過擴展適配器能夠對更多類型的處理器進行執行。

四、處理器Handler(須要工程師開發)
注意:編寫Handler時按照HandlerAdapter的要求去作,這樣適配器才能夠去正確執行Handler
Handler 是繼DispatcherServlet前端控制器的後端控制器,在DispatcherServlet的控制下Handler對具體的用戶請求進行處理。
因爲Handler涉及到具體的用戶業務請求,因此通常狀況須要工程師根據業務需求開發Handler。

五、視圖解析器View resolver(不須要工程師開發),由框架提供
做用:進行視圖解析,根據邏輯視圖名解析成真正的視圖(view)
View Resolver負責將處理結果生成View視圖,View Resolver首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對象,最後對View進行渲染將處理結果經過頁面展現給用戶。 springmvc框架提供了不少的View視圖類型,包括:jstlView、freemarkerView、pdfView等。
通常狀況下須要經過頁面標籤或頁面模版技術將模型數據經過頁面展現給用戶,須要由工程師根據業務需求開發具體的頁面。

六、視圖View(須要工程師開發jsp...)
View是一個接口,實現類支持不一樣的View類型(jsp、freemarker、pdf...)

核心架構的具體流程步驟以下:
一、首先用戶發送請求——>DispatcherServlet,前端控制器收到請求後本身不進行處理,而是委託給其餘的解析器進行處理,做爲統一訪問點,進行全局的流程控制;
二、DispatcherServlet——>HandlerMapping, HandlerMapping 將會把請求映射爲HandlerExecutionChain 對象(包含一個Handler 處理器(頁面控制器)對象、多個HandlerInterceptor 攔截器)對象,經過這種策略模式,很容易添加新的映射策略;
三、DispatcherServlet——>HandlerAdapter,HandlerAdapter 將會把處理器包裝爲適配器,從而支持多種類型的處理器,即適配器設計模式的應用,從而很容易支持不少類型的處理器;
四、HandlerAdapter——>處理器功能處理方法的調用,HandlerAdapter 將會根據適配的結果調用真正的處理器的功能處理方法,完成功能處理;並返回一個ModelAndView 對象(包含模型數據、邏輯視圖名);
五、ModelAndView的邏輯視圖名——> ViewResolver, ViewResolver 將把邏輯視圖名解析爲具體的View,經過這種策略模式,很容易更換其餘視圖技術;
六、View——>渲染,View會根據傳進來的Model模型數據進行渲染,此處的Model實際是一個Map數據結構,所以很容易支持其餘視圖技術;
七、返回控制權給DispatcherServlet,由DispatcherServlet返回響應給用戶,到此一個流程結束。

下邊兩個組件一般狀況下須要開發:

Handler:處理器,即後端控制器用controller表示。

View:視圖,即展現給用戶的界面,視圖中一般須要標籤語言展現模型數據。

 

在將SpringMVC以前咱們先來看一下什麼是MVC模式

MVC:MVC是一種設計模式

MVC的原理圖:

分析:

M-Model 模型(完成業務邏輯:有javaBean構成,service+dao+entity)

V-View 視圖(作界面的展現  jsp,html……)

C-Controller 控制器(接收請求—>調用模型—>根據結果派發頁面)

 

springMVC是什麼: 

  springMVC是一個MVC的開源框架,springMVC=struts2+spring,springMVC就至關因而Struts2加上sring的整合,可是這裏有一個疑惑就是,springMVC和spring是什麼樣的關係呢?這個在百度百科上有一個很好的解釋:意思是說,springMVC是spring的一個後續產品,其實就是spring在原有基礎上,又提供了web應用的MVC模塊,能夠簡單的把springMVC理解爲是spring的一個模塊(相似AOP,IOC這樣的模塊),網絡上常常會說springMVC和spring無縫集成,其實springMVC就是spring的一個子模塊,因此根本不須要同spring進行整合。

SpringMVC的原理圖:

看到這個圖你們可能會有不少的疑惑,如今咱們來看一下這個圖的步驟:(能夠對比MVC的原理圖進行理解)

第一步:用戶發起請求到前端控制器(DispatcherServlet)

第二步:前端控制器請求處理器映射器(HandlerMappering)去查找處理器(Handle):經過xml配置或者註解進行查找

第三步:找到之後處理器映射器(HandlerMappering)像前端控制器返回執行鏈(HandlerExecutionChain)

第四步:前端控制器(DispatcherServlet)調用處理器適配器(HandlerAdapter)去執行處理器(Handler)

第五步:處理器適配器去執行Handler

第六步:Handler執行完給處理器適配器返回ModelAndView

第七步:處理器適配器向前端控制器返回ModelAndView

第八步:前端控制器請求視圖解析器(ViewResolver)去進行視圖解析

第九步:視圖解析器像前端控制器返回View

第十步:前端控制器對視圖進行渲染

第十一步:前端控制器向用戶響應結果

看到這些步驟我相信你們很感受很是的亂,這是正常的,可是這裏主要是要你們理解springMVC中的幾個組件:

前端控制器(DispatcherServlet):接收請求,響應結果,至關於電腦的CPU。

處理器映射器(HandlerMapping):根據URL去查找處理器

處理器(Handler):(須要程序員去寫代碼處理邏輯的)

處理器適配器(HandlerAdapter):會把處理器包裝成適配器,這樣就能夠支持多種類型的處理器,類比筆記本的適配器(適配器模式的應用)

視圖解析器(ViewResovler):進行視圖解析,多返回的字符串,進行處理,能夠解析成對應的頁面

 

Spring框架IOC和AOP的實現原理

IoC(Inversion of Control)  

(1). IoC(Inversion of Control)是指容器控制程序對象之間的關係,而不是傳統實現中,由程序代碼直接操控。控制權由應用代碼中轉到了外部容器,控制權的轉移是所謂反轉。 對於Spring而言,就是由Spring來控制對象的生命週期和對象之間的關係;IoC還有另一個名字——「依賴注入(Dependency Injection)」。從名字上理解,所謂依賴注入,即組件之間的依賴關係由容器在運行期決定,即由容器動態地將某種依賴關係注入到組件之中。  

(2). 在Spring的工做方式中,全部的類都會在spring容器中登記,告訴spring這是個什麼東西,你須要什麼東西,而後spring會在系統運行到適當的時候,把你要的東西主動給你,同時也把你交給其餘須要你的東西。全部的類的建立、銷燬都由 spring來控制,也就是說控制對象生存週期的再也不是引用它的對象,而是spring。對於某個具體的對象而言,之前是它控制其餘對象,如今是全部對象都被spring控制,因此這叫控制反轉。

(3). 在系統運行中,動態的向某個對象提供它所須要的其餘對象。  

(4). 依賴注入的思想是經過反射機制實現的,在實例化一個類時,它經過反射調用類中set方法將事先保存在HashMap中的類屬性注入到類中。 總而言之,在傳統的對象建立方式中,一般由調用者來建立被調用者的實例,而在Spring中建立被調用者的工做由Spring來完成,而後注入調用者,即所謂的依賴注入or控制反轉。 注入方式有兩種:依賴注入和設置注入; IoC的優勢:下降了組件之間的耦合,下降了業務對象之間替換的複雜性,使之可以靈活的管理對象。

AOP(Aspect Oriented Programming)

(1). AOP面向方面編程基於IoC,是對OOP的有益補充;

(2). AOP利用一種稱爲「橫切」的技術,剖解開封裝的對象內部,並將那些影響了 多個類的公共行爲封裝到一個可重用模塊,並將其名爲「Aspect」,即方面。所謂「方面」,簡單地說,就是將那些與業務無關,卻爲業務模塊所共同調用的 邏輯或責任封裝起來,好比日誌記錄,便於減小系統的重複代碼,下降模塊間的耦合度,並有利於將來的可操做性和可維護性。

(3). AOP表明的是一個橫向的關 系,將「對象」比做一個空心的圓柱體,其中封裝的是對象的屬性和行爲;則面向方面編程的方法,就是將這個圓柱體以切面形式剖開,選擇性的提供業務邏輯。而 剖開的切面,也就是所謂的「方面」了。而後它又以巧奪天功的妙手將這些剖開的切面復原,不留痕跡,但完成了效果。

(4). 實現AOP的技術,主要分爲兩大類:一是採用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行爲的執行;二是採用靜態織入的方式,引入特定的語法建立「方面」,從而使得編譯器能夠在編譯期間織入有關「方面」的代碼。

(5). Spring實現AOP:JDK動態代理和CGLIB代理 JDK動態代理:其代理對象必須是某個接口的實現,它是經過在運行期間建立一個接口的實現類來完成對目標對象的代理;其核心的兩個類是InvocationHandler和Proxy。 CGLIB代理:實現原理相似於JDK動態代理,只是它在運行期間生成的代理對象是針對目標類擴展的子類。CGLIB是高效的代碼生成包,底層是依靠ASM(開源的java字節碼編輯類庫)操做字節碼實現的,性能比JDK強;須要引入包asm.jar和cglib.jar。     使用AspectJ注入式切面和@AspectJ註解驅動的切面實際上底層也是經過動態代理實現的。

(6). AOP使用場景:                     

Authentication 權限檢查        

Caching 緩存        

Context passing 內容傳遞        

Error handling 錯誤處理        

Lazy loading 延遲加載        

Debugging  調試      

logging, tracing, profiling and monitoring 日誌記錄,跟蹤,優化,校準        

Performance optimization 性能優化,效率檢查        

Persistence  持久化        

Resource pooling 資源池        

Synchronization 同步        

Transactions 事務管理    

另外Filter的實現和struts2的攔截器的實現都是AOP思想的體現。  

相關文章
相關標籤/搜索