美文网首页
SpringMVC源码简析

SpringMVC源码简析

作者: future1900 | 来源:发表于2020-03-06 20:34 被阅读0次

本人学习过程中参考了其他博客,做了一些笔记在有道云中,忘记保存原博客地址,作者看到可联系本人,本人核实后加上,谢谢。
本人目前水平有限,后期深入学习后会补上不足的地方,感谢阅览。

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响应用户。
SpringMVC的运行原理.jpg

以下开始源码分析

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()doGetdoPost方法,销毁是执行HttpServlet的destory()方法。

xml.png

init()方法

下面我们来看看init()方法中SpringMVC干了什么

init()

最终发现init()是在HttpServletBean类中,并且是final修饰的方法,说明子类中是不存在其他init()方法,在init()方法中调用了initServletBean(),按住CTRL+鼠标左键点击进入查看子类FrameworkServlet的实现。

initServletBean()

FrameworkServletinitServletBean()方法中调用了initWebApplicationContext()方法,查看其源码

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

service()方法

下面我们来看看service()方法都干了什么。

service()

service()方法通过调用processRequest()方法放行请求,processRequest()方法实际是调用了doService()方法

doService()
  • 867行:声明Map集合
  • 874行:给Map集合插入值
  • 880行:给request设置值
  • 893行:最终调用doDispatch()方法
doDispatch()
  • 939行:HandlerAdapterDispatcherServlet中调用
    其他先忽略

相关文章

  • SpringMVC源码简析

    本人学习过程中参考了其他博客,做了一些笔记在有道云中,忘记保存原博客地址,作者看到可联系本人,本人核实后加上,谢谢...

  • mybatis-spring解析

    1、概述 原生Mybatis源码简析(上)原生Mybatis源码简析(下)在介绍原生Mybatis源码简析文章中,...

  • 53--Web应用上下文环境创建

    1. Web应用上下文环境创建简析 通过上一节的分析,找到了SpringMVC源码分析的入口,接下来看Web应用上...

  • SpringMVC的过程简析

    Spring MVC是基于MCV(Model、View和Control)模型,利用处理器分离模型、视图和控制,以便...

  • Flink自定义StreamOperator

    在上一篇StreamOperator源码简析从源码角度分析了StreamOperator以及其实现类,此篇幅主要分...

  • OkHttp源码简析

    Android平台有很多优秀的开源库,OkHttp绝对是其中的佼佼者,它是Square出品的一个网络通讯库,功能强...

  • HashMap源码简析

    说到HashMap相信大家并不陌生,这是一个非常常用的以键值对形式存储的数据结构,但是对其内部原理可能不是很了解,...

  • Handler源码简析

    消息------Message 消息的复用:Message.obtain() public static M...

  • Mask源码简析

    版本 源码版本:2017.3.0 着色器版本:2017.3.0 Mask使用方法 https://jingyan....

  • Wax源码简析

    阅读的是阿里维护的Wax版本 先针对如下用法的实现过程进行讲解。 用法 用法讲解 详细的Wax用法讲解,请参阅ht...

网友评论

      本文标题:SpringMVC源码简析

      本文链接:https://www.haomeiwen.com/subject/wqbirhtx.html