Spring MVC 源码解析

写在前面

  在分析 Spring AOP 源码之前,如果你对 Spring IOC、依赖注入(DI) 原理不是很清楚,建议您先了解一下:Spring IOC 源码解析Spring 依赖注入(DI) 源码解析,这样或许会让你的思路更加清晰。

1.什么是 MVC

  MVC 作为一种设计模式,并不是仅限于 Java Web 应用,还包括许多应用,比如前端、PHP、.NET 等语言。之所以那么做的根本原因在于解耦各个模块

MVC 是 ModelViewController 的缩写,分别代表 Web 应用程序中的 3 种职责。

  • 模型(Model):用于存储数据以及处理用户请求的业务逻辑。
  • 视图(View):向控制器提交数据,显示模型中的数据。
  • 控制器(Controller):根据视图提出的请求判断将请求和数据交给哪个模型处理,将处理后的有关结果交给哪个视图更新显示。

2.Spring MVC

基于 Servlet 的 MVC 模式的具体实现如下:

  • 模型:一个或多个 JavaBean 对象,用于存储数据(实体模型,由 JavaBean 类创建)和处理业务逻辑(业务模型,由一般的 Java 类创建)。
  • 视图:一个或多个 JSP 页面,向控制器提交数据和为模型提供数据显示,JSP 页面主要使用 HTML 标记和 JavaBean 标记来显示数据。视图层 Spring MVC 框架是可配置的,并不关心使用的视图技术,你还可以选择 Velocity、Freemarker 等。
  • 控制器:一个或多个 Servlet 对象,根据视图提交的请求进行控制,即将请求转发给处理业务逻辑的 JavaBean,并将处理结果存放到实体模型 JavaBean 中,输出给视图显示。

3.Spring MVC 工作流程

Spring MVC工作流程图.png

各个组件作用如下:

  • 前端控制器(DispatcherServlet):接受用户请求,分发请求,响应结果;
  • 处理器映射器(HandlerMapping):根据请求 URL 查找处理器;
  • 处理器适配器(HandlerAdapter):适配映射器返回的处理器;
  • 处理器(Handler):用于处理业务请求,项目中叫做 Controller
  • 视图解析器(ViewResolver):根据视图名称,进行查找,并生成视图对象(此处可自行配置);
  • 视图(View):用于视图的渲染操作,是一个接口。

4.Spring MVC的初始化

Spring MVC的初始化主要有两部分组成`

1.初始化Spring IOC

  • 通过配置ContextLoderListener完成

2.初始化映射请求上下文

  • 通过配置 DispatcherServlet 完成

注意:如果没有配置 Spring IOC 的初始化类 ContextLoderListener,那么 DispatcherServlet 在它初始化的时候会对 Spring IOC 进行初始化,一般来说最好在DispatcherServlet 初始化之前就完成 Spring IOC 初始化。(附:web.xml配置信息)

<!--全局参数-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring.xml</param-value>
</context-param>
<!--监听器--> 
<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>
    <!--如果已经配置了 ContextLoaderListener 和 全局参数,此处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 的使用应该有所了解。我们在使用 Spring MVC 时,都会在 web.xml中添加如下配置信息,所以我们就是从 DispatcherServlet 这个类开始分析。

DispatcherServlet结构图.png

  从图中我们看到 DispatcherServlet 继承自 HttpServlet 类,它也是一个 Servlet 容器。在 Spring 容器启动的时候,Spring MVC就会执行初始化操作。HttpServlet 有两大核心方法:init() 和 service() 方法,init() 方法位于 HttpServletBean 父类下,所以:①我们从 init() 方法解析   ②解析完成后,执行 doService() 方法开始完成 MVC 流程`

6.Spring MVC 源码分析时序图

\color{red}{单击放大查看(高清图下载请转至文末链接)}】你也可以直接访问链接获取: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.网盘地址:spring-framework-5.0.2.RELEASE (中文注释)版本(提取码:uck4 )


恭喜您,枯燥源码看到这里。 Spring MVC 源码介绍到此为止


博主写作不易,来个关注呗

求关注、求点赞,加个关注不迷路 ヾ(◍°∇°◍)ノ゙

博主不能保证写的所有知识点都正确,但是能保证纯手敲,错误也请指出,望轻喷 Thanks♪(・ω・)ノ

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343