SpringMVC源码之解读DispatcherServlet初始化流程

【MVC】SpringMVC源码分析之启动流程 Spring MVC源码分析之启动流程 阅读详情

  原帖地址:http://blog.youkuaiyun.com/roderick2015/article/details/52846240,转载请注明。

  我们先回顾下在Web应用中构建SpringMVC框架的大体流程:
  1.使用Maven等工具引入依赖(依赖的jar包还不少)。
  2.在web.xml中配置DispatcherServlet。
  3.创建spring-mvc.xml文件,在这里写上我们对SpringMVC的定制化配置(或者使用注解类的方式)。
  4.编写Controller类,使用注解的方式指定与URL对应的处理方法(当然你可能还得准备JSP之类的页面)。
  5.发布到Web容器(本帖使用的是Tomcat)并启动。

  整个流程并不复杂,但每个步骤所涉及的东西比较多,一不小心配错可就糟糕了。但这参与感十足的配置方式除了它的灵活性外,也能让我们更加清楚框架在为我们服务之前,到底做了哪些事情,接下来我们就到源码中去看看SpringMVC的核心入口类DispatcherServlet在Web容器启动后做了哪些准备。

  从DispatcherServlet的名字可以知道它是个Servlet,我们看下它在web.xml中的具体配置,代码如下所示。

    <servlet>
        //servlet的名字
        <servlet-name>dispatcher</servlet-name>
        //指定具体的类
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        //以类似HashMap中key和value的方式给servlet配置一些参数信息
        <init-param>
            //指定context配置文件的路径
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:/spring-mvc.xml</param-value>
        </init-param>
        <init-param>
            //不要在意这个参数,帖子后面会提到的
            <param-name>publishContext</param-name>
            <param-value>true</param-value>
        </init-param>
        //大于或等于1表示web容器在启动的时候就会调用,值越大优先级越高
        //0或-1表示在第一次被使用的时候才会调用
        <load-on-startup>1</load-on-startup>
    </servlet>

    //url路径映射
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

  接着看它的继承体系,如下图所示。

这里写图片描述

  图中可以很清晰地看到DispatcherServlet的继承主线是比较单一的:DispatcherServlet —> FrameworkServlet —> HttpServletBean,我们主要分析这三个类,后面的HttpServlet到Servlet接口属于Java的Servlet原生代码,其中GenericServlet也参与了初始化,整个初始化流程如下图所示。
这里写图片描述

  声明:本帖所示的代码一律省略源码中的log日志输出,以精简阅读。

  在 Tomcat启动时会加载应用的Web.xml文件,这时就会扫描到DispatchServlet,然后调用init方法进行初始化(就是Servlet接口的init方法嘛),该方法的具体实现在DispatchServlet的父类GenericServlet中,也是DispatchServlet初始化的入口。

GenericServlet

  GenericServlet初始化的时候就干了两件事:
  1.接收Tomcat传过来的ServletConfig。
  2.调用空方法init,供子类覆写实现后续的初始化。

    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }

    public void init() throws ServletException {

    }

  这里看下config里面到底装了什么东西,如下图所示。
这里写图片描述

  StandardWrapper和ApplicationContextFacade都是Tomcat中的对象,本帖不作详细说明,只需要知道ApplicationContextFacade里放的是整个Web应用的上下文信息,StandardWrapper则是针对DispatchServlet的,它两的作用域不同。如下图所示,可以看到我们在Web.xml文件中配置的相关数据。
这里写图片描述

HttpServletBean

  接着HttpServletBean作为子类覆写了GenericServlet的init方法,代码如下所示。

    @Override
    public 
Spring源码——Spring MVC 前言 内容主要参考自《Spring源码深度解析》一书,算是读书笔记或是原书的补充。进入正文后可能会引来各种不适,毕竟阅读源码是件极其痛苦的事情。 本文主要涉及书中第十一章的部分,依照书中内容以及个人理解对Spring源码进行了注释,详见Github仓库:https://github.com/MrSorrow/spring-framework Spring框架提供了构建Web应用程序的全功能MVC模... 阅读详情

相关推荐

SpringMVC DispatcherServlet执行流程及源码分析

你要知道的SpringMVC DispatcherServlet执行流程及源码分析都在这里转载请注明出处 http://www.jianshu.com/p/0f981efdfbbd本系列文章主要根据源码讲解SpringMVC的启动过程,以及相关重要组件的源码分析。阅读此系列文章需要具备Spring以及SpringMVC相关知识。本文将分以下几篇文章进行讲解,读者可按需查阅。 SpringMVC 启动

什么都不会的小菜鸟 1388

VCSA 6.7证书更新全流程指南:从故障诊断到完整替换

本文详细介绍了VCSA 6.7证书更新的全流程,包括故障诊断、证书替换操作步骤及常见问题解决方案。通过使用官方脚本和证书管理器,帮助管理员快速解决证书过期问题,确保vCenter系统的稳定运行。特别强调了STS证书修复和全量证书重置的关键步骤,适用于vcsa6.7环境下的证书管理需求。

weixin_42634811的博客 450

Unity URP半透明物体深度排序优化:解决自交叠渲染瑕疵

本文深入探讨了Unity URP管线中半透明物体深度排序的优化方法,重点解决自交叠区域的渲染瑕疵问题。通过双通道渲染、深度预写入、多通道渲染等核心技术,结合实战案例和性能数据,帮助开发者实现高质量的透明效果渲染。

weixin_30879169的博客 418

MIMO技术入门

MIMO:多天线技术,发射端和接收端有多个天线(注意:并不是指多个天线板,而是多套振子,每一套是一个独立的天线。) 4G:2、8天线 5G:4、64天线(64T64R) 手机也是多天线 MIMO实现效果的分类: 1)空间分集 。2)空间复用。3)波束赋形。 空间分集(space diversity) 作用:提升接收质量 利用多个天线发射或者接收一个数据流,避免单个信道衰落对整个链路的影响。(比如你的耳机坏了一只并不影响另一只) 空间复用(space multiplexing) 作用:提升速率 利

About1129的博客 2873

MCP4728 电路及stm32F103程序移植

写在前面 通过优快云查到一些MCP4728 的程序,结合程序及datasheet对于驱动的描述,理清了思路 感谢开路者! MCP4728的电路比较简单,见下文描述 应用电路 datasheet: 实际测试电路: SCL接stm32的PB10,SDA接PB11 RDY/BSY引脚和LDCA引脚,悬空 解释见截图: MCP4728地址 选择任意输出通道写入DAC输入寄存器 应用程序 int mcp4728_write_all_channel(float vol1, float vol2, fl

u013074298的专栏 5422

告别高延迟!用RV1106+4G模块+libdatachannel搭建低功耗WebRTC监控,保姆级避坑指南

本文详细介绍了如何利用RV1106低功耗处理器、4G模块和libdatachannel库构建嵌入式WebRTC监控系统,解决高延迟问题。通过硬件选型、系统优化和核心代码实现,提供了一套完整的低功耗实时视频传输方案,特别适合智能安防和工业物联网应用。

weixin_42527401的博客 192

手势控制 Python !Leap Motion Python 开发教程 (二)

手势控制 Python !Leap Motion Python 开发教程 (二) 现在进入正题,我来给大家总结一下我在使用 Leap Motion 开发过程中的经验以及学到的东西,其中我会概括以及翻译官方给出的注释,为了让这些注释更加通俗易懂,让大家更好理解。 回顾 在上一篇文章中我们讲了如何配置 Leap Motion 的 Python 2.7 的开发环境,如果您还没有配置好您的开发环境,可以参...

成畅的博客 3191

量子编程专业权威教程(十四):Shor 算法

本文系统阐述了Shor算法的原理与实现,重点解析了将大数分解问题转化为周期寻找问题的数论基础,以及模幂运算量子电路的设计方法。通过以N=15为例的完整算法流程演示,展示了量子计算在因数分解问题上的指数级优势。文章详细拆解了受控幺正操作构建、量子傅里叶变换应用等关键技术环节,并提供了可复现的Qiskit代码实现。同时指出了当前量子硬件在比特数、相干时间和错误率等方面面临的工程挑战,这些限制使得分解大整数仍需长期技术突破。该研究为理解量子计算优势提供了典型范例,对后量子密码学发展具有重要启示意义。

分享知识,拥抱变化 797

Underactuated Robotics - 欠驱动机器人学(一)- 全驱动与欠驱动系统

根据牛顿的观点,机械系统的动力学是二阶的(其状态由位置向量 q(也称为配置向量)和速度向量以及(可能还有)时间给出。二阶控制动力系统的一般形式是:其中 u 是控制向量。定义 1.1 (欠驱动控制微分方程) 二阶控制微分方程描述如下:在状态和时间 t 中,如果所得到的映射是可射的:对于每一个,都存在一个能产生预期响应的,那么系统就是全驱动的。否则,就是欠驱动(状态在时间 t)。

机器人控制与仿真应用 3377

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: 深入浅出ClassLoader
下一篇: Nginx/ZooKeeper 负载均衡的差异
Roderick2015
博客等级 码龄10年 9粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值