SpringMVC的執(zhí)行過程淺析
前言
通過深入分析Spring源碼,我們知道Spring框架包括大致六大模塊, 如Web模塊,數(shù)據(jù)庫訪問技術模塊,面向切面模塊,基礎設施模塊,核心容器模塊和模塊,
其中,在Spring框架的Web模塊中,又包含很多前端技術,如SpringMVC,Spring WebSocket,Spring WebPortlet等,在本篇文章中,我們主要分析SpringMVC模塊,
在分析SpringMVC技術時,本篇文章將通過解讀SpringMVC源碼,并通過編譯器斷點調(diào)試追蹤,研究Spring核心類的UML圖,來深入剖析SpringMVC的執(zhí)行過程。
一 Spring核心模塊
下圖為Spring核心模塊,其中SpringMVC模塊位于Spring框架的Web模塊部分
二 SpringMVC執(zhí)行原理
下圖為SpringMVC的一個較完整的流程圖,實線表示SpringMVC框架提供的技術,不需要開發(fā)者實現(xiàn),虛線表示需要開發(fā)者實現(xiàn)。
簡要分析執(zhí)行流程:
1.DispatcherServlet表示前置控制器,是整個SpringMVC的控制中心。用戶發(fā)出請求,DispatcherServlet接收請求并攔截請求,
我們假設請求的url為:
http://localhost:9999/SpringMVC/input-product
如上url拆分成三部分:
(1)http://localhost:9999 服務器域名
(2)SpringMVC部署在服務器(http://localhost:9999)上的web站點
(3)input-product表示控制器
通過分析,如上url表示為:請求位于服務器localhost:9999上的SpringMVC站點的input-product控制器
2.HandlerMapping為處理器映射。DispatcherServlet調(diào)用HandlerMapping,HandlerMapping根據(jù)請求url查找Handler
3.HandlerExecution表示具體的Handler,其主要作用是根據(jù)url查找控制器,如上url被查找控制器為:input-product
4.HandlerExecution將解析后的信息傳遞給DispatcherServlet,如解析控制器映射等
5.HandlerAdapter表示處理器適配器,其按照特定的規(guī)則去執(zhí)行Handler
6.Handler讓具體的Controller執(zhí)行
7.Controller將具體的執(zhí)行信息返回給HandlerAdapter,如ModelAndView
8.HandlerAdapter將視圖邏輯名或模型傳遞給DispatcherServlet
9.DispatcherServlet調(diào)用視圖解析器(ViewResolver)來解析HandlerAdapter傳遞的邏輯視圖名
10.視圖解析器將解析的邏輯視圖名傳給DispatcherServlet
11.DispatcherServlet根據(jù)視圖解析器解析的視圖結(jié)果,調(diào)用具體的視圖
12.最終視圖呈現(xiàn)給用戶。
三 SpringMVC核心組件
(一)DispatcherServlet
DispatcherServlet就是所謂的SpringMVC前端控制器,作為整個SpringMVC的控制中心,,其相關UML如下所示:
(二)HandlerMapping
HandlerMapping主要用來解析請求url,解析出控制器,從而映射控制器,其相關類有16個。
如下為HandlerMapping的UML圖
(三)HandlerAdapter
HandlerAdapter主要是調(diào)度Controller來處理業(yè)務邏輯等,想相關類有6個。
如下為HandlerAdapter的UML:
(四)ViewResolver
ViewResolver接口主要作用是解析DispatcherServlet傳遞的邏輯視圖名,并將解析結(jié)果傳回給DispatcherServlet。實現(xiàn)該接口的相關類或接口共有19個。
如下為ViewResolver主要的UML:
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
相關文章
SpringBoot2.1.x,創(chuàng)建自己的spring-boot-starter自動配置模塊操作
這篇文章主要介紹了SpringBoot2.1.x,創(chuàng)建自己的spring-boot-starter自動配置模塊操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09@MapperScan和@ComponentScan一塊使用導致沖突的解決
這篇文章主要介紹了@MapperScan和@ComponentScan一塊使用導致沖突的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11Java的NIO之并發(fā)環(huán)境下非阻塞IO技術詳解
這篇文章主要介紹了Java的NIO之并發(fā)環(huán)境下非阻塞IO技術詳解,Java NIO(New IO)是Java平臺提供的一種用于高效處理I/O操作的API,它引入了一組新的類和概念,以提供更好的性能和可擴展性,需要的朋友可以參考下2023-09-09淺析Spring容器原始Bean是如何創(chuàng)建的
這篇文章主要是想和小伙伴們一起聊聊?Spring?容器創(chuàng)建?Bean?最最核心的?createBeanInstance?方法,文中的示例代碼講解詳細,需要的可以參考一下2023-08-08使用list stream:對List中的對象先進行排序再獲取前n個對象
這篇文章主要介紹了使用list stream:對List中的對象先進行排序再獲取前n個對象,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09IntelliJ?IDEA?2023版本創(chuàng)建Spring項目時Java只能選擇17或21的問題解決方法
spring-boot是一個基于Java的開源框架,用于快速構建生產(chǎn)級別的應用程序,這篇文章主要給大家介紹了關于IntelliJ?IDEA?2023版本創(chuàng)建Spring項目時Java只能選擇17或21的問題解決方法,需要的朋友可以參考下2024-07-07Java 線程池ExecutorService詳解及實例代碼
這篇文章主要介紹了Java 線程池ExecutorService詳解及實例代碼的相關資料,線程池減少在創(chuàng)建和銷毀線程上所花的時間以及系統(tǒng)資源的開銷.如果不使用線程池,有可能造成系統(tǒng)創(chuàng)建大量線程而導致消耗系統(tǒng)內(nèi)存以及”過度切換“2016-11-11