SpringMVC启动过程详解(li)

  通过对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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fusioncharts json java,FusionCharts使用教程:利用XML/JSON属性加载外部LOGO

在使用FusionCharts图表时&#xff0c;你可以在运行时加载外部Logo并显示于图表中。Logo可以是GIF/JPEG/PNG或SWF文件。你可以使用chart元素的logoURL属性来加载一个Logo。XMLJSON{"chart":{ "yaxisname":"Sales Figure", "caption":&…

java redis 多节点,Redis单机多节点集群部署,超简单

1、在虚拟机中部署具有三个主节点&#xff0c;三个从节点的集群(注&#xff0c;必须要有从节点)&#xff0c;虚拟机的IP地址为192.168.133.129&#xff0c;三个主节点的部口号分别为7001(从&#xff1a;7004)、7002(从&#xff1a;7005)、7003(从&#xff1a;7006)。2、安装Red…

matlab检测串口数据帧头,MATLAB 串口读取姿态数据及GUI实时动态显示设计

上一篇实现了Matlab 对串口数据的读取&#xff0c;数据可以读取并且保存到本地。本文主要设计GUI并且动态的显示曲线。可以更直观的观察实时的姿态数据和传感器数据。GUI设计效果&#xff1a;姿态GUi.png分别设置三个区域&#xff0c;分别为数据接收显示区域&#xff0c;串口设…

[转]面向对象的六大原则

现在编程的主流语言基本上都是面向对象的。如C#&#xff0c;C&#xff0c;JAVA。我们在使用时&#xff0c;已经构造了一个个的类。但是往往由于我们在类内部或外部的设计上存在种种问题&#xff0c;导致尽管是面向对象的语言&#xff0c;却是面向过程的逻辑&#xff0c;甚至维护…

matlab中response函数,matlab函数的种类

突然发现matlab的函数还是很有讲究的&#xff0c;以前只是用&#xff0c;很少注意这个问题&#xff0c;现在看到了稍微总结一下吧。在matlab帮助中搜索Types of Functions&#xff0c;可以看到matlab常用的函数种类&#xff1a;Anonymous Functions --匿名函数Primary Function…

面向对象的十大原则

面向对象设计原则是OOPS&#xff08;Object-Oriented Programming System&#xff0c;面向对象的程序设计系统&#xff09;编程的核心&#xff0c;但大多数Java程序员追逐像Singleton、Decorator、Observer这样的设计模式&#xff0c;而不重视面向对象的分析和设计。甚至还有经…

php返回支付状态,magento paypal返回支付状态

paypal帐户&#xff0c;帐户类型分为Personal(个人)、Premier(高级)和Business(商业)&#xff0c;他们的差别对于开发者来 说主要是返回的信息&#xff0c;Personal的不能使用IPN和PDT等商家工具&#xff0c;即不能获取交易信息&#xff0c;但是Personal帐户收款无需手续 费&am…

上下文管理、redis发布订阅、RabbitMQ发布订阅、SQLAlchemy

一、上下文管理 import contextlib contextlib.contextmanager def work_state(state_list,worker_thread):state_list.append(worker_thread)try:yieldfinally:state_list.remove(worker_thread) free_list[] current_thread"alex" with work_state(free_list,curr…

php symbol table,gdb方式遍历EG(symbol_table) 哈希表的key_PHP教程

Sara Golemon写过一篇文章&#xff0c;里面提到&#xff1a;“是否存在特别的地方可以找到GLOBALS数组&#xff1f;”答案是“存在”&#xff0c;就是EG(symbol_table)&#xff0d;Executor Globals结构&#xff0c;她也给出了找的具体实例&#xff0c;如下PHP_FUNCTION(confir…

常用快捷键归纳

CtrlX     剪贴 CtrlC    复制 CtrlV    粘贴 CtrlD    删除对应行 CtrlA    全选 CtrlZ    撤销 Alt↑    两行代码互换 CtrlAltX J 运行代码 CtrlshiftO 添加缺少的包&#xff0c; Ctrlshift↓  向下复制本行代码转载于:https://www.cnblogs.c…

php edm 系统,edm.php

// ----------------------------------------------------------------------// | 科创众达// ----------------------------------------------------------------------// | Copyright (c) 2011 http://ctrlcoo.com All rights reserved.// -------------------------------…

jQuery选择id属性带有.点符号元素的方法

如果jquery要选择的元素id中带有点符号&#xff0c;在选择时需要在点前面加上两个反斜杠&#xff0c;如&#xff1a;$("#address\\.street").text("Enter this field");<div id"address.street"> http://www.jb51.net </div> 转载于…

单账户登录踢人 php,踢人下线

前言 在java的世界里&#xff0c;有很多优秀的权限认证框架&#xff0c;如Apache Shiro、Spring Security 等等。这些框架背景强大&#xff0c;历史悠久&#xff0c;其生态也比较齐全。 但同时这些框架也并非十分完美&#xff0c;在前后台分离已成标配的互联网时代&#xff0c;…

python 基础,包括列表,元组,字典,字符串,set集合,while循环,for循环,运算符。...

1.continue 的作用&#xff1a;跳出一次循环&#xff0c;进行下一次循环2.break 跳出不再循环3.常量 &#xff08;全是大写&#xff09;NAME cjk 一般改了会出错4.python的第三方库&#xff0c;先安装再导入。装模块&#xff1a;pip 命令例如&#xff1a;pip install pandas5…

10054 java,为什么Socket.Receive在远程主机断开连接时抛出SocketException(10054)?

我以前用C编写套接字程序&#xff0c;无法理解为什么会发生这种情况 .我的服务器在接收调用时阻塞&#xff0c;当它返回0时&#xff0c;我打破了while循环并关闭了线程 .public class MyServer {public MyServer() {}public void Init() {ThreadPool.QueueUserWorkItem(StartLi…

SQL 截取字符

select SUBSTRING(123,abcdefg,charindex(,,123,abcdefg,0)1,LEN(123,abcdefg)-charindex(,,123,abcdefg,0)) select SUBSTRING(123,abcdefg,0,charindex(,,123,abcdefg,0))转载于:https://www.cnblogs.com/kunEssay/p/5726672.html

hdoj 1004 学习思路

hdoj 1004题目大概讲的是&#xff0c;将输入的字符串根据输入次数多少&#xff0c;输出出现次数最多的字符串。 题目逻辑很简单&#xff0c;就是需要选择相应的数据结构&#xff0c;看了别人提交的discuss&#xff0c;明显发现可以使用多种数据结构解这道题。 其实我本是打算用…

oracle 关闭数据库实列,Oracle 11g 数据库启动和关闭

Oracles11数据库的启动状态Oracle11g在启动的时候必须经过三个状态&#xff1a;NOMOUNT,MOUNT,OPEN。NOMOUNT: 此状态下只打开数据库实例&#xff0c;读取参数文件。MOUNT: 根据参数文件信息&#xff0c;打开控制文件。读取控制文件中的各种信息&#xff0c;如数据文件位置&…

JavaScript进阶(下)

指定分隔符连接数组元素join() join()方法用于把数组中的所有元素放入一个字符串。元素是通过指定的分隔符进行分隔的。 语法&#xff1a; arrayObject.join(分隔符) 参数说明: 注意&#xff1a;返回一个字符串&#xff0c;该字符串把数组中的各个元素串起来&#xff0c;用<…

oracle报无效月份 注册表,在oracle中插入时间时出现“无效的月份”解决方法

这个问题是我曾经在使用中遇到的&#xff0c;在网上搜了一下&#xff0c;发现很多人都遇到过&#xff0c;并且也说明了很多解决方法。引起这个问题是有很多种可能的&#xff0c;现在我将在网上收集的资料结合我自己的解决经验总结一下&#xff0c;希望对大家有帮助。我用的是or…