Spring MVC 源碼解析

寫在前面

??在分析 Spring AOP 源碼之前,如果你對 Spring IOC、依賴注入(DI) 原理不是很清楚,建議您先了解一下:Spring IOC 源碼解析、Spring 依賴注入(DI) 源碼解析,這樣或許會讓你的思路更加清晰。

1.什么是 MVC

??MVC 作為一種設(shè)計模式,并不是僅限于 Java Web 應(yīng)用,還包括許多應(yīng)用,比如前端、PHP、.NET 等語言。之所以那么做的根本原因在于解耦各個模塊。

MVC 是 ModelViewController 的縮寫,分別代表 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 工作流程

Spring MVC工作流程圖.png

各個組件作用如下:

  • 前端控制器(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結(jié)構(gòu)圖.png

??從圖中我們看到 DispatcherServlet 繼承自 HttpServlet 類,它也是一個 Servlet 容器。在 Spring 容器啟動的時候,Spring MVC就會執(zhí)行初始化操作。HttpServlet 有兩大核心方法:init() 和 service() 方法,init() 方法位于 HttpServletBean 父類下,所以:①我們從 init() 方法解析 ??②解析完成后,執(zhí)行 doService() 方法開始完成 MVC 流程`

6.Spring MVC 源碼分析時序圖

\color{red}{單擊放大查看(高清圖下載請轉(zhuǎn)至文末鏈接)}】你也可以直接訪問鏈接獲?。?a target="_blank">https://www.processon.com/view/5e69f2fde4b00fb1da123491

Spring MVC源碼解析時序圖.jpg

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?(?ω?)?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容