Spring5源码分析(五):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 工作流程

在这里插入图片描述

各个组件作用如下:
  • 前端控制器(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 继承自 HttpServlet 类,它也是一个 Servlet 容器。在 Spring 容器启动的时候,Spring MVC就会执行初始化操作。HttpServlet 有两大核心方法:init() 和 service() 方法,init() 方法位于 HttpServletBean 父类下,所以:①我们从 init() 方法解析   ②解析完成后,执行 doService() 方法开始完成 MVC 流程

6.Spring MVC 源码分析时序图  单击放大查看(高清图下载请转至文末链接)

在这里插入图片描述

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 源码介绍到此为止

如果本文对你有所帮助,那就给我点个赞呗 ^ _ ^

End

发布了301 篇原创文章 · 获赞 66 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/lzb348110175/article/details/104821274