1. 程式人生 > >SpringMVC執行流程及原始碼分析

SpringMVC執行流程及原始碼分析

# SpringMVC流程及原始碼分析 前言 ​ 學了一遍SpringMVC以後,想著做一個總結,複習一下。複習寫下面的總結的時候才發現,其實自己學的並不徹底、牢固、也沒有學全,視訊跟書本是要結合起來一起,每一位老師的視訊可能提到的東西都不一致,也導致也不是很全面,書本上會講的筆記系統、全面。同時我自己也是一個初學者,下面總結的可能並不完善、正確,希望看到的大神給我指出,在此非常感謝。 ------ [TOC] # 一 、Spring核心模組 ## 1、核心模組 ​ Spring Web MVC (下文簡稱為 SpringMVC )是 Spring 提供 Web 應用的框架設計,屬於表現層的框架。SpringMVC是Spring框架的一部分。 Spring框架包括大致六大模組,核心容器(Core Container)、AOP和裝置支援、資料訪問及整合、Web、報文傳送、Test ![2021022601-01-Spring5核心模組圖解](https://gitee.com/chuchq/blogs-gallery/raw/master/images%20/%202021/2021022601-01-Spring5核心模組圖解.png) 圖片來源於Spring官網5.0.0.M5: ​ [https://docs.spring.io/spring-framework/docs/5.0.0.M5/spring-framework-reference/html/overview.html#overview-modules](https://docs.spring.io/spring-framework/docs/5.0.0.M5/spring-framework-reference/html/overview.html#overview-modules) 對於Spring5模組圖,有2點疑問: 1、不清楚為什麼在Spring官網上5.0版本以後,Release版(穩定版)的都未找到模組圖,但是在M(里程碑版)版找到 了,如果有人在5.0以後的Release版(穩定版)找到,麻煩給我留個言,謝謝。 2、在其他博文中看到Spring5模組結構圖是這樣的: ![2021022601-02-Spring5核心模組圖解-疑問](https://gitee.com/chuchq/blogs-gallery/raw/master/images%20/%202021/2021022601-02-Spring5核心模組圖解-疑問.png) 挺奇怪這個圖是哪裡來的?(路過的大神請指點) 對於問題2,我在Spring5.2.13.RELEASE GA中,找到了如下所示資訊: ![2021022601-03-Spring5核心模組圖解-5.2.13.RELEASE](https://gitee.com/chuchq/blogs-gallery/raw/master/images%20/%202021/2021022601-03-Spring5核心模組圖解-5.2.13.RELEASE.png) 拷貝以上資訊: Spring Framework Documentation Version 5.2.13.RELEASE *What’s New*, *Upgrade Notes*, *Supported Versions*, and other topics, independent of release cadence, are maintained externally on the project’s [**Github Wiki**](https://github.com/spring-projects/spring-framework/wiki). | [Overview](https://docs.spring.io/spring-framework/docs/5.2.13.RELEASE/spring-framework-reference/overview.html#overview) | history, design philosophy, feedback, getting started. | | ------------------------------------------------------------ | ------------------------------------------------------------ | | [Core](https://docs.spring.io/spring-framework/docs/5.2.13.RELEASE/spring-framework-reference/core.html#spring-core) | IoC Container, Events, Resources, i18n, Validation, Data Binding, Type Conversion, SpEL, AOP. | | [Testing](https://docs.spring.io/spring-framework/docs/5.2.13.RELEASE/spring-framework-reference/testing.html#testing) | Mock Objects, TestContext Framework, Spring MVC Test, WebTestClient. | | [Data Access](https://docs.spring.io/spring-framework/docs/5.2.13.RELEASE/spring-framework-reference/data-access.html#spring-data-tier) | Transactions, DAO Support, JDBC, O/R Mapping, XML Marshalling. | | [Web Servlet](https://docs.spring.io/spring-framework/docs/5.2.13.RELEASE/spring-framework-reference/web.html#spring-web) | Spring MVC, WebSocket, SockJS, STOMP Messaging. | | [Web Reactive](https://docs.spring.io/spring-framework/docs/5.2.13.RELEASE/spring-framework-reference/web-reactive.html#spring-webflux) | Spring WebFlux, WebClient, WebSocket. | | [Integration](https://docs.spring.io/spring-framework/docs/5.2.13.RELEASE/spring-framework-reference/integration.html#spring-integration) | Remoting, JMS, JCA, JMX, Email, Tasks, Scheduling, Caching. | | [Languages](https://docs.spring.io/spring-framework/docs/5.2.13.RELEASE/spring-framework-reference/languages.html#languages) | Kotlin, Groovy, Dynamic Languages. | 按照以上資訊的Web Servlet、Web Reactive已經是分屬於不同的模組了。 - Web Servlet:Spring MVC, WebSocket, SockJS, STOMP Messaging. - Web Reactive:Spring WebFlux, WebClient, WebSocket. Spring官方文件:[https://spring.io/projects/spring-framework#learn/](https://spring.io/projects/spring-framework#learn/) ## 2、Spring版本命名規則(補充) 上面提到了Spring又不同的版本,在此記錄一下各個版本的意義。 | 描述方式 | 說明 | 含義 | | -------- | -------- | :------------------------------------------------------- | | Snapshot | 快照版 | 尚不穩定,仍處於開發中的版本 | | Release | 穩定版 | 功能相對穩定,可以對外發行,但有時間限制 | | GA | 正式版 | 代表廣泛可用的穩定版(General Availability) | | M | 里程碑版 | (M是Milestone的意思)具有一些全新的功能或是有意義的版本 | | RC | 終測版 | Release Candidate(最終測試),即將作為正式版釋出 | # 二、SpringMVC流程及原理 ## 1、執行流程 SpringMVC執行流程圖 ![2021022601-04-魯班學院-springmvc流程圖-2清晰點](https://gitee.com/chuchq/blogs-gallery/raw/master/images%20/%202021/2021022601-04-魯班學院-springmvc流程圖-2清晰點.png)圖片來源:三、引用參考資料 ### 1.1、執行流程 - 01、使用者傳送出請求到前端控制器(中央處理器)DispatcherServlet進行處理。 - 02、前端控制器DispatcherServlet收到請求後,呼叫處理器對映器HandlerMapping。 - 03、處理器對映器HandlerMapping(處理器對映器)根據request請求的URL等資訊查詢能夠進行處理的Handler,以及相關攔截器interceptor,並構造HandlerExecutionChain執行鏈,然後將構造好的HandlerExecutionChain執行鏈物件返回給前端控制器DispatcherServlet。 - 04、前端控制器DispatcherServlet根據處理器對映器HandlerMapping的 - 05、處理器介面卡HandlerAdapter經過適配呼叫具體的處理器(Handler/Controller),即業務中自己寫的Controller。 - 06、Controller處理完後返回ModelAndView(springmvc的封裝物件,將model和view封裝在一起)給處理器介面卡HandlerAdapter; - 07、處理器介面卡HandlerAdapter將Controller執行結果ModelAndView返回給前端控制器DispatcherServlet。 - 08、前端控制器DispatcherServlet呼叫檢視解析器ViewReslover處理ModelAndView。 - 09、檢視解析器ViewReslover解析後根據邏輯檢視名解析成物理檢視名即具體的頁面地址,生成並返回具體物件View(springmvc封裝物件,是一個介面)。 - 10、前端控制器DispatcherServlet根據物件View進行檢視渲染,填充Model。 - 11、前端控制器DispatcherServlet向用戶返回響應 ### 1.2、執行流程說明: #### 1.2.1、第02、03說明 (1) 處理器對映器:springmvc框架中的一種物件,框架把實現了HandlerMapping介面的類都叫做對映器(多個); (2) 處理器對映器作用:根據請求,從springmvc容器物件中獲取處理器物件(MyController controller = ctx.getBean("some") (3) 框架把找到的處理器物件放到一個叫做處理器執行鏈(HandlerExecutionChain)的類儲存 (4) HandlerExecutionchain:類中儲存著  a:處理器物件(MyController);  b:專案中的所有的攔