寫在前面
??在分析 Spring AOP 源碼之前,如果你對 Spring IOC、依賴注入(DI) 原理不是很清楚,建議您先了解一下:Spring IOC 源碼解析、Spring 依賴注入(DI) 源碼解析,這樣或許會讓你的思路更加清晰。
1.什么是 MVC
??MVC 作為一種設(shè)計模式,并不是僅限于 Java Web 應(yīng)用,還包括許多應(yīng)用,比如前端、PHP、.NET 等語言。之所以那么做的根本原因在于解耦各個模塊。
MVC 是 Model、View 和 Controller 的縮寫,分別代表 Web 應(yīng)用程序中的 3 種職責。
- 模型(Model):用于存儲數(shù)據(jù)以及處理用戶請求的業(yè)務(wù)邏輯。
- 視圖(View):向控制器提交數(shù)據(jù),顯示模型中的數(shù)據(jù)。
- 控制器(Controller):根據(jù)視圖提出的請求判斷將請求和數(shù)據(jù)交給哪個模型處理,將處理后的有關(guān)結(jié)果交給哪個視圖更新顯示。
2.Spring MVC
基于 Servlet 的 MVC 模式的具體實現(xiàn)如下:
- 模型:
一個或多個 JavaBean 對象,用于存儲數(shù)據(jù)(實體模型,由 JavaBean 類創(chuàng)建)和處理業(yè)務(wù)邏輯(業(yè)務(wù)模型,由一般的 Java 類創(chuàng)建)。 - 視圖:
一個或多個 JSP 頁面,向控制器提交數(shù)據(jù)和為模型提供數(shù)據(jù)顯示,JSP 頁面主要使用 HTML 標記和 JavaBean 標記來顯示數(shù)據(jù)。視圖層 Spring MVC 框架是可配置的,并不關(guān)心使用的視圖技術(shù),你還可以選擇 Velocity、Freemarker 等。 - 控制器:
一個或多個 Servlet 對象,根據(jù)視圖提交的請求進行控制,即將請求轉(zhuǎn)發(fā)給處理業(yè)務(wù)邏輯的 JavaBean,并將處理結(jié)果存放到實體模型 JavaBean 中,輸出給視圖顯示。
3.Spring MVC 工作流程

各個組件作用如下:
- 前端控制器(DispatcherServlet):接受用戶請求,分發(fā)請求,響應(yīng)結(jié)果;
- 處理器映射器(HandlerMapping):根據(jù)請求 URL 查找處理器;
- 處理器適配器(HandlerAdapter):適配映射器返回的處理器;
-
處理器(Handler):用于處理業(yè)務(wù)請求,
項目中叫做 Controller; - 視圖解析器(ViewResolver):根據(jù)視圖名稱,進行查找,并生成視圖對象(此處可自行配置);
- 視圖(View):用于視圖的渲染操作,是一個接口。
4.Spring MVC的初始化
Spring MVC的初始化主要有兩部分組成`
1.初始化Spring IOC
- 通過配置ContextLoderListener完成
2.初始化映射請求上下文
- 通過配置 DispatcherServlet 完成
注意:如果沒有配置 Spring IOC 的初始化類 ContextLoderListener,那么 DispatcherServlet 在它初始化的時候會對 Spring IOC 進行初始化,一般來說最好在DispatcherServlet 初始化之前就完成 Spring IOC 初始化。(附:web.xml配置信息)
<!--全局參數(shù)-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
<!--監(jiān)聽器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--servlet信息配置-->
<servlet>
<servlet-name>mvcDemo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--如果已經(jīng)配置了 ContextLoaderListener 和 全局參數(shù),此處init-param就無需再配了-->
<!--如果init-param也配置了的話,Spring IOC 容器會被加載 2 次,浪費資源-->
<!--<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvcDemo</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
5.Spring MVC 源碼分析從何入手
??相信大家對 Spring MVC 的使用應(yīng)該有所了解。我們在使用 Spring MVC 時,都會在 web.xml中添加如下配置信息,所以我們就是從 DispatcherServlet 這個類開始分析。

??從圖中我們看到 DispatcherServlet 繼承自 HttpServlet 類,它也是一個 Servlet 容器。在 Spring 容器啟動的時候,Spring MVC就會執(zhí)行初始化操作。HttpServlet 有兩大核心方法:init() 和 service() 方法,init() 方法位于 HttpServletBean 父類下,所以:①我們從 init() 方法解析 ??②解析完成后,執(zhí)行 doService() 方法開始完成 MVC 流程`
6.Spring MVC 源碼分析時序圖
【】你也可以直接訪問鏈接獲?。?a target="_blank">https://www.processon.com/view/5e69f2fde4b00fb1da123491

7.源碼分析
??此處不再一步步介紹源碼,你可以按照 6.Spring MVC 源碼分析時序圖 ,打開源碼來進一步分析,此處粘貼過多代碼無多大意義。附 spring-framework-5.0.2.RELEASE (中文注釋)版本,直接解壓 IDEA 打開即可。
地址: 1.spring-framework-5.0.2.RELEASE (中文注釋)版本
?????2.網(wǎng)盤地址:spring-framework-5.0.2.RELEASE (中文注釋)版本(提取碼:uck4 )
恭喜您,枯燥源碼看到這里。 Spring MVC 源碼介紹到此為止
博主寫作不易,來個關(guān)注唄
求關(guān)注、求點贊,加個關(guān)注不迷路 ヾ(?°?°?)??
博主不能保證寫的所有知識點都正確,但是能保證純手敲,錯誤也請指出,望輕噴 Thanks?(?ω?)?