寫在前面
??在分析 Spring AOP 源碼之前,如果你對 Spring IOC仿贬、依賴注入(DI) 原理不是很清楚前标,建議您先了解一下:Spring IOC 源碼解析、Spring 依賴注入(DI) 源碼解析确买,這樣或許會(huì)讓你的思路更加清晰斤讥。
1.什么是 MVC
??MVC 作為一種設(shè)計(jì)模式,并不是僅限于 Java Web 應(yīng)用湾趾,還包括許多應(yīng)用,比如前端芭商、PHP、.NET 等語言
搀缠。之所以那么做的根本原因在于解耦各個(gè)模塊
铛楣。
MVC 是 Model
、View
和 Controller
的縮寫艺普,分別代表 Web 應(yīng)用程序中的 3 種職責(zé)簸州。
- 模型(Model):用于存儲數(shù)據(jù)以及處理用戶請求的業(yè)務(wù)邏輯鉴竭。
- 視圖(View):向控制器提交數(shù)據(jù),顯示模型中的數(shù)據(jù)岸浑。
- 控制器(Controller):根據(jù)視圖提出的請求判斷將請求和數(shù)據(jù)交給哪個(gè)模型處理搏存,將處理后的有關(guān)結(jié)果交給哪個(gè)視圖更新顯示。
2.Spring MVC
基于 Servlet 的 MVC 模式的具體實(shí)現(xiàn)如下:
- 模型:
一個(gè)或多個(gè) JavaBean 對象
矢洲,用于存儲數(shù)據(jù)(實(shí)體模型璧眠,由 JavaBean 類創(chuàng)建)和處理業(yè)務(wù)邏輯(業(yè)務(wù)模型,由一般的 Java 類創(chuàng)建)读虏。 - 視圖:
一個(gè)或多個(gè) JSP 頁面
责静,向控制器提交數(shù)據(jù)和為模型提供數(shù)據(jù)顯示,JSP 頁面主要使用 HTML 標(biāo)記和 JavaBean 標(biāo)記來顯示數(shù)據(jù)盖桥。視圖層 Spring MVC 框架是可配置的灾螃,并不關(guān)心使用的視圖技術(shù),你還可以選擇 Velocity揩徊、Freemarker 等腰鬼。 - 控制器:
一個(gè)或多個(gè) Servlet 對象
,根據(jù)視圖提交的請求進(jìn)行控制靴拱,即將請求轉(zhuǎn)發(fā)給處理業(yè)務(wù)邏輯的 JavaBean垃喊,并將處理結(jié)果存放到實(shí)體模型 JavaBean 中,輸出給視圖顯示袜炕。
3.Spring MVC 工作流程
各個(gè)組件作用如下:
- 前端控制器(DispatcherServlet):接受用戶請求本谜,分發(fā)請求,響應(yīng)結(jié)果偎窘;
- 處理器映射器(HandlerMapping):根據(jù)請求 URL 查找處理器乌助;
- 處理器適配器(HandlerAdapter):適配映射器返回的處理器;
-
處理器(Handler):用于處理業(yè)務(wù)請求陌知,
項(xiàng)目中叫做 Controller
他托; - 視圖解析器(ViewResolver):根據(jù)視圖名稱,進(jìn)行查找仆葡,并生成視圖對象(此處可自行配置)赏参;
- 視圖(View):用于視圖的渲染操作,是一個(gè)接口沿盅。
4.Spring MVC的初始化
Spring MVC的初始化主要有兩部分組成`
1.初始化Spring IOC
- 通過配置ContextLoderListener完成
2.初始化映射請求上下文
- 通過配置 DispatcherServlet 完成
注意:如果沒有配置 Spring IOC 的初始化類 ContextLoderListener把篓,那么 DispatcherServlet 在它初始化的時(shí)候會(huì)對 Spring IOC 進(jìn)行初始化,一般來說最好在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 容器會(huì)被加載 2 次,浪費(fèi)資源-->
<!--<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 時(shí)疗锐,都會(huì)在 web.xml
中添加如下配置信息坊谁,所以我們就是從 DispatcherServlet
這個(gè)類開始分析。
??從圖中我們看到 DispatcherServlet 繼承自 HttpServlet 類滑臊,它也是一個(gè) Servlet 容器口芍。在 Spring 容器啟動(dòng)的時(shí)候,Spring MVC就會(huì)執(zhí)行初始化操作简珠。HttpServlet 有兩大核心方法:init() 和 service() 方法阶界,init() 方法位于 HttpServletBean 父類下,所以:①我們從 init() 方法解析 ??②解析完成后聋庵,執(zhí)行 doService() 方法開始完成 MVC 流程`
6.Spring MVC 源碼分析時(shí)序圖
【】你也可以直接訪問鏈接獲取:https://www.processon.com/view/5e69f2fde4b00fb1da123491
7.源碼分析
??此處不再一步步介紹源碼芙粱,你可以按照 6.Spring MVC 源碼分析時(shí)序圖
祭玉,打開源碼來進(jìn)一步分析,此處粘貼過多代碼無多大意義春畔。附 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 源碼介紹到此為止
博主寫作不易,來個(gè)關(guān)注唄
求關(guān)注择份、求點(diǎn)贊扣孟,加個(gè)關(guān)注不迷路 ヾ(?°?°?)??
博主不能保證寫的所有知識點(diǎn)都正確,但是能保證純手敲荣赶,錯(cuò)誤也請指出凤价,望輕噴 Thanks?(?ω?)?