写在前面
在分析 Spring AOP 源码之前,如果你对 Spring IOC、依赖注入(DI) 原理不是很清楚,建议您先了解一下:Spring IOC 源码解析、Spring 依赖注入(DI) 源码解析,这样或许会让你的思路更加清晰。
1.什么是 MVC
MVC 作为一种设计模式,并不是仅限于 Java Web 应用,还包括许多应用,比如前端、PHP、.NET 等语言
。之所以那么做的根本原因在于解耦各个模块
。
MVC 是 Model
、View
和 Controller
的缩写,分别代表 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 源码分析时序图
【】你也可以直接访问链接获取: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.网盘地址:spring-framework-5.0.2.RELEASE (中文注释)版本(提取码:uck4 )
恭喜您,枯燥源码看到这里。 Spring MVC 源码介绍到此为止
博主写作不易,来个关注呗
求关注、求点赞,加个关注不迷路 ヾ(◍°∇°◍)ノ゙
博主不能保证写的所有知识点都正确,但是能保证纯手敲,错误也请指出,望轻喷 Thanks♪(・ω・)ノ