通过对SpringMVC启动过程的深入研究,期望掌握Java Web容器启动过程;掌握SpringMVC启动过程;了解SpringMVC的配置文件如何配置,为什么要这样配置;掌握SpringMVC是如何工作的;掌握Spring源码的设计和增强阅读源码的技巧。

目录

1.Web容器初始化过程

2.SpringMVC中web.xml配置

3.认识ServletContextListener

4.认识ContextLoaderListener

5.DispatcherServlet初始化(HttpServletBean • FrameworkServlet • DispatcherServlet)

6.ContextLoaderListener与DispatcherServlet关系

7.DispatcherServlet的设计

8.DispatcherServlet工作原理

一、Web容器初始化过程

上图展示了web容器初始化的过程,其官方文档给出了这样的描述:

  When a web application is deployed into a container, the following steps must be performed, in this order, before the web application begins processing client requests.

  1. Instantiate an instance of each event listener identified by a <listener> element in the deployment descriptor.
  2. For instantiated listener instances that implement ServletContextListener, call the contextInitialized() method.
  3. Instantiate an instance of each filter identified by a <filter> element in the deployment descriptor and call each filter instance's init() method.
  4. Instantiate an instance of each servlet identified by a <servlet> element that includes a <load-on-startup> element in the order defined by the load-on-startup element values, and call each servlet instance's init() method.

二、SpringMVC中web.xml的配置

上图是截取的web.xml中的配置,在<listener>标签中定义了spring容器加载器;在<servlet>标签中定义了spring前端控制器。

上图是源码中接口ServletContextListener的定义,可以看到在其注释中指明:servlet和Filter初始化前和销毁后,都会给实现了servletContextListener接口的监听器发出相应的通知。

上面是类ContextLoadListener的定义,它实现了上面的servletContextListener。这里用到了代理模式,简单的代理了ContextLoader类。ContextLoadListener类用来创建Spring application context,并且将application context注册到servletContext里面去。

结合上面的WEB容器启动的过程,以及接口ServletContextListener和类ContextLoadListener。我们知道:

  在 Servlet API中有一个ServletContextListener接口,它能够监听ServletContext对象的生命周期,实际上就是监听Web应用的生命周期。当Servlet容器启动或终止Web应用时,会触发ServletContextEvent事件,该事件由ServletContextListener来处理。在ServletContextListener接口中定义了处理ServletContextEvent 事件的两个方法contextInitialized()和contextDestroyed()。

  ContextLoaderListener监听器的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置了这个监听器,启动容器时,就会默认执行它实现的方法。由于在ContextLoaderListener中关联了ContextLoader这个类,所以整个加载配置过程由ContextLoader来完成。

上面是initWebApplicationContext的过程,方法名称即是其含义。方法中首先创建了WebApplicationContext,配置并且刷新实例化整个SpringApplicationContext中的Bean。因此,如果我们的Bean配置出错的话,在容器启动的时候,会抛异常出来的。

  综上,ContextLoaderListener类起着至关重要的作用。它读取web.xml中配置的context-param中的配置文件,提前在web容器初始化前准备业务对应的Application context;将创建好的Application context放置于ServletContext中,为springMVC部分的初始化做好准备。

三、DispatchServlet初始化

  在SpringMVC架构中,DispatchServlet负责请求分发,起到控制器的作用。下面详细来解释说明:

DispatchServlet名如其义,它的本质上是一个Servlet。从上面图可以看到,下层的子类不断的对HttpServlet父类进行方法扩展。

上图是抽象类HttpServletBean的实现,我们知道HttpServlet有两大核心方法:init()和service()方法。HttpServletBean重写了init()方法,在这部分,我们可以看到其实现思路:公共的部分统一来实现,变化的部分统一来抽象,交给其子类来实现,故用了abstract class来修饰类名。此外,HttpServletBean提供了一个HttpServlet的抽象实现,使的Servlet不再关心init-param部分的赋值,让servlet更关注于自身Bean初始化的实现。

上图是FrameworkServlet的官方定义, 它提供了整合web javabean和spring application context的整合方案。那么它是如何实现的呢?在源码中我们可以看到通过执行initWebApplicationContext()方法和initFrameworkServlet()方法实现。

DispatchServlet是HTTP请求的中央调度处理器,它将web请求转发给controller层处理,它提供了敏捷的映射和异常处理机制。DispatchServlet转发请求的核心代码在doService()方法中实现,详细代码参照图上。

上图是DispatchServlet类和ContextLoaderListener类的关系图。首先,用ContextLoaderListener初始化上下文,接着使用DispatchServlet来初始化WebMVC的上下文。

上图是DispatchServlet的工作流程图,作为HTTP请求的中央控制器,它在SpringMVC中起着分发请求的作用。下面总结了DispatchServlet设计的一些特点总结。

四、请求流程

转载于:https://www.cnblogs.com/RunForLove/p/5688731.html

SpringMVC启动过程详解(li)相关推荐

  1. Linux开启动过程详解

    Linux开启动过程详解 Linux启动过程 前言: Linux是一种自由和开放源代码的类UNIX操作系统.该操作系统的内核由林纳斯·托瓦兹在1991年10月5日首次发布.在加上用户空间的应用程序之后 ...

  2. centos7 启动流程图_Linux启动过程详解

    Linux启动过程详解 作者:江远航 一.启动流程图如下 图1 Linux启动流程图 BIOS ---> MBR ---> Kernel---> Init 二.Linux启动顺序 一 ...

  3. Delta3d框架学习--程序启动过程详解

    一个Delta3d程序启动过程详解 一.初始化一个dtGame::GameApplication的实例,dtGame::GameApplication* app = new dtGame::GameA ...

  4. 朱老师ARM裸机学习笔记(四):S5PV210启动过程详解

    常用器件特性 内存: SRAM 静态内存 特点就是容量小.价格高,优点是不需要软件初始化直接上电就能用 DRAM 动态内存 特点就是容量大.价格低,缺点就是上电后不能直接使用,需要软件初始化后才可以使 ...

  5. Spring启动过程详解

    Spring启动过程详解 前言 spring容器启动过程 AnnotationConfigApplicationContext 有参数构造方法 无参数构造 AnnotatedBeanDefinitio ...

  6. linux efi 启动原理,Linux(RHEL6)启动过程详解

    Linux(RHEL6)启动过程详解 Linux(红帽RHEL6)启动过程详解: RHEL的一个重要和强大的方面是它是开源的,并且系统的启动过程是用户可配置的.用户可以自由的配置启动过程的许多方面,包 ...

  7. 嵌入式linux的u-boot系统启动过程,【站友投递】U-boot启动过程详解

    [站友投递]U-boot启动过程详解 来源:互联网 作者:denny 时间:2009-03-18 Tag:点击: 一.U-BOOT的目录结构 u-boot目录下有18个子目录,分别存放管理不通的源程序 ...

  8. 家用计算机启动过程 装载主引导记录,计算机启动过程详解

    综述: 计算机启动时经过了哪些过程: 计算机接通电源后,第一步要进行加电自检,也就是POST(Power On Self Test),检查RAM.驱动器等:第二步BIOS会读取活动分区主引导记录的启动 ...

  9. SpringBoot启动过程详解

    Spring Boot通常有一个名为*Application的入口类,在入口类里有一个main方法,这个main方法其实就是一个标准的java应用的入口方法. 在main方法中使用SpringAppl ...

最新文章

  1. SQL Server之其他函数——空值处理
  2. Linux中Apache2fail,apache2 启动失败,出现下列错误,请问怎么解决,谢谢
  3. 计算机关闭开启启动程序,如何设置开机启动项?电脑开机启动项怎么增加与关闭?...
  4. 容器中apscheduler不执行_APScheduler:定时任务框架
  5. JNI开发笔记(八)--Java读取txt文件进行JNI测试
  6. python项目练手(一)------飞船大战游戏
  7. 计算机学的是苹果系统,苹果电脑装windows7教程 苹果电脑装windows7方法
  8. 兼容IE,Firefox,chrome等浏览器 : 设为首页和收藏的Javascript代码
  9. 在SOUI里使用真窗口时使用SOUI的滚动条
  10. 2021年UI设计面试问题及答案解析
  11. C++ 野指针和悬空指针
  12. 没有基础学习java编程,去培训机构怎么样?
  13. AUTOSAR NvMFee Configuration
  14. 【53期分享】4款毕业答辩PPT模板免费下载
  15. 华为硬件笔试 通用器件知识2_汽车智能化的起点-车规级元器件
  16. 端云协同,打造更易用的AI计算平台
  17. cmd命令查看路由器上记录的IP地址与MAC地址(ARP表)
  18. 3D EXPERIENCE DraftSight的协作能力
  19. Witt向量简介 论文的参考文献
  20. 矩阵理论| 基础:特征值与特征向量、代数重数/几何重数、相似对角化和Jordan标准型

热门文章

  1. spring源码分析第一天------源码分析知识储备
  2. 通俗易懂的SpringBoot教程---day1---Springboot入门教程介绍
  3. java的守护进程与非守护进程
  4. 每个java小应用程序都得继承,JAVA复习题3
  5. rpm包安装mysql配置文件目录_CentOS6.5系统下RPM包安装MySQL5.6
  6. arduino串口输入改变模式模块
  7. c语言猴子选大王指针,C语言描述怎么用循环队列实现猴子选大王
  8. 2018全国计算机音乐大赛一等奖,2018全国数字音乐大赛总决赛精彩无限!小学员的技能震惊评委!...
  9. gsonformat插件_裂墙推荐!IntelliJ IDEA 常用插件一览,让效率成为习惯
  10. 删除linux目录下一半的文件,Linux面试题(一):删除一个目录下的所有文件,但保留一个指定文件...