SpirngMVC源码简析

SpirngMVC流程综述

  1. 用户发送请求至前端控制器DispatcherServlet。
  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
  3. 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
  4. DispatcherServlet调用HandlerAdapter处理器适配器。
  5. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
  6. Controller执行完成返回ModelAndView。
  7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
  9. ViewReslover解析后返回具体View。
  10. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
  11. DispatcherServlet响应用户。
    在这里插入图片描述

以下开始源码分析

xml配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee                       
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
	
	<!-- SpringMVC前端控制器 -->
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
</web-app>

从DispatcherServlet中进入源码,选中DispatcherServlet,在eclipse中按F4会发现,其实DispatcherServlet是继承了HttpServlet的,我们都知道HttpServlet 的生命周期是先实例化,初始化,处理请求,销毁,在初始化时是执行HttpServlet的init()方法,处理请求执行HttpServlet的service()或doGet或doPost方法,销毁是执行HttpServlet的destory()方法。
在这里插入图片描述

init()方法

下面我们来看看init()方法中SpringMVC干了什么
在这里插入图片描述
最终发现init()是在HttpServletBean类中,并且是final修饰的方法,说明子类中是不存在其他init()方法,在init()方法中调用了initServletBean(),按住CTRL+鼠标左键点击进入查看子类FrameworkServlet的实现。
在这里插入图片描述
在FrameworkServlet的initServletBean()方法中调用了initWebApplicationContext()方法,查看其源码

在这里插入图片描述

  • 518行:WebApplicationContext是Spring容器,得到Spring容器rootContext
  • 524行:得到SpringMVC容器wac
  • 533行:将rootContext设置为wac的父容器,所有很多人说Spring是SpringMVC的父容器 其他暂不考虑,有兴趣自行了解

service()方法

下面我们来看看service()方法都干了什么。
在这里插入图片描述
service()方法通过调用processRequest()方法放行请求,processRequest()方法实际是调用了doService()方法
在这里插入图片描述

  • 867行:声明Map集合
  • 874行:给Map集合插入值
  • 880行:给request设置值
  • 893行:最终调用doDispatch()方法
    在这里插入图片描述
  • 939行:HandlerAdapter在DispatcherServlet中调用 其他先忽略

最后

在这里插入图片描述

上面都是自己整理好的!我就把资料贡献出来给有需要的人!顺便求一波关注。学习我们是认真的,拿大厂offer是势在必得的。想了解点击一下java交流群哦

[java交流群](想了解更多点一下哦)

作者:future1900
链接:https://juejin.im/post/5e632d81f265da571e2628ff

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值