SpringMVC執行流程及原始碼分析
阿新 • • 發佈:2021-03-06
# 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:專案中的所有的攔