DispatcherServlet是如何进行初始化的呢?

2023-11-01

转自:

DispatcherServlet是如何进行初始化的呢?

下文笔者讲述DispatcherServlet的初始化顺序,如下所示:

Web容器启动时将调用HttpServletBean的init方法

public abstract class HttpServletBean extends HttpServlet implements EnvironmentAware{
    @Override
    public final void init() throws ServletException {
       //省略部分代码
       //1、如下代码的作用是将Servlet初始化参数设置到该组件上
       //如contextAttribute、contextClass、namespace、contextConfigLocation;
       try {
           PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
           BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
           ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
           bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, this.environment));
           initBeanWrapper(bw);
           bw.setPropertyValues(pvs, true);
       }
       catch (BeansException ex) {
           //…………省略其他代码
       }
       //2、提供给子类初始化的扩展点,该方法由FrameworkServlet覆盖
       initServletBean();
       if (logger.isDebugEnabled()) {
           logger.debug("Servlet '" + getServletName() + "' configured successfully");
       }
    }
    //…………省略其他代码
}
将Servlet初始化参数(init-param)设置到该组件上(如contextAttribute、contextClass、namespace、contextConfigLocation)
通过BeanWrapper简化设值过程,方便后续使用;
为子类初始化扩展点initServletBean()该方法由FrameworkServlet覆盖

FrameworkServlet通过initServletBean()进行Web上下文初始化

public abstract class FrameworkServlet extends HttpServletBean {
	@Override
    protected final void initServletBean() throws ServletException {
        //省略部分代码
       try {
             //1、初始化Web上下文
           this.webApplicationContext = initWebApplicationContext();
             //2、提供给子类初始化的扩展点
           initFrameworkServlet();
       }
        //省略部分代码
    }
}
initFrameworkServlet方法主要作用如下:
初始化web上下文; 
提供给子类初始化扩展点;
protected WebApplicationContext initWebApplicationContext() {
	//ROOT上下文(ContextLoaderListener加载的)
   WebApplicationContext rootContext =
		  WebApplicationContextUtils.getWebApplicationContext(getServletContext());
   WebApplicationContext wac = null;
   if (this.webApplicationContext != null) {
	   // 1、在创建该Servlet注入的上下文
	   wac = this.webApplicationContext;
	   if (wac instanceof ConfigurableWebApplicationContext) {
		  ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) wac;
		  if (!cwac.isActive()) {
			  if (cwac.getParent() == null) {
				  cwac.setParent(rootContext);
			  }
			  configureAndRefreshWebApplicationContext(cwac);
		  }
	   }
   }
   if (wac == null) {
		 //2、查找已经绑定的上下文
	   wac = findWebApplicationContext();
   }
   if (wac == null) {
		//3、如果没有找到相应的上下文,并指定父亲为ContextLoaderListener
	   wac = createWebApplicationContext(rootContext);
   }
   if (!this.refreshEventReceived) {
		 //4、刷新上下文(执行一些初始化)
	   onRefresh(wac);
   }
   if (this.publishContext) {
	   // Publish the context as a servlet context attribute.
	   String attrName = getServletContextAttributeName();
	   getServletContext().setAttribute(attrName, wac);
	   //省略部分代码
   }
   return wac;
}
initWebApplicationContext()方法的功能,
如果ContextLoaderListener加载了上下文
将作为根上下文(DispatcherServlet的父容器)
最后调用了onRefresh()方法执行容器的一些初始化
 这个方法由子类实现,来进行扩展

DispatcherServlet实现了onRefresh()方法提供一些前端控制器相关的配置

public class DispatcherServlet extends FrameworkServlet {
     //实现子类的onRefresh()方法,该方法委托为initStrategies()方法。
    @Override
    protected void onRefresh(ApplicationContext context) {
       initStrategies(context);
    }

    //初始化默认的Spring Web MVC框架使用的策略(如HandlerMapping)
    protected viod initStrategies(ApplicationContext context){
		initMultipartResolver(context);//初始化上传文件解析器
		initLocaleResolver(context);//初始化本地解析器
		initThemeResolver(context);//初始化主题解析器
		initHandlerMapping(context);
		//初始化处理器映射器,将请求映射到处理器
		initHandlerAdapters(context);//初始化处理器适配器
		initHandlerExceptionResolver(context);
		//初始化处理器异常解析器,如果执行过程中遇到异常将交给HandlerExceptionResolver来解析
		initRequestToViewNameTranslator(context);
		//初始化请求到具体视图名称解析器
		initViewResolvers(context);
		//初始化视图解析器,通过ViewResolver解析逻辑视图名到具体视图实现
		initFlshMapManager(context);//初始化flash映射管理
	}
}
initStrategies方法
  将在WebApplicationContext初始化后自动执行
  自动扫描上下文的Bean
 根据名称或者类型匹配的机制查找自定义组件
如果没有找到则会装配一套Spring的默认组件
在org.springframework.web.servlet路径下有一个DispatcherServlet.properties配置文件
该文件指定了DispatcherServlet所使用的默认组件
DispatcherServlet启动时会进行我们需要的Web层Bean的配置
如HandlerMapping、HandlerAdapter等,而且如果我们没有配置,还会给我们提供默认的配置

DispatcherServlet主要完成以下工作:
 初始化Spring Web MVC使用的Web上下文
 初始化DispatcherServlet使用的策略,如HandlerMapping、HandlerAdapter等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DispatcherServlet是如何进行初始化的呢? 的相关文章

  • 解析@EnableWebMvc 、WebMvcConfigurationSupport和WebMvcConfigurationAdapter

    在spring boot spring mvc 的项目中 有些时候我们需要自己配置一些项目的设置 就会涉及到这三个 那么 他们之间有什么关系呢 首先 EnableWebMvc WebMvcConfigurationSupport 使用了 E
  • Spring MVC 数据绑定入门

    一 应用intellij IDEA创建SpringMVC项目 简单介绍一下 eclipse和idea有些概念上的差别 eclipse中的workspace相当于idea中的project eclipse中的project相当于idea中的m
  • 基于Spring + Spring MVC + Mybatis 高性能web构建

    原文地址 http blog csdn net zoutongyuan article details 41379851 参考地址 http blog csdn net gebitan505 article details 44455235
  • Day31——单个拦截器中三个方法的执行顺序以及时机

    一 回顾 前面拦截器简介用实现HandlerInterceptor接口实现了自定义拦截器 可以知道它有三个需要实现的方法 分别是preHandle postHandle afterCompletion 二 知识储备 2 1 单个拦截器中三个
  • Spring Aop自定义注解用在Controller层

    前提项目用的框架是SpringMVC 切面类 Aspect Component 把这个注掉是为了不让Spring中扫描 应该让SpringMVC扫描 public class SysLogAop Pointcut annotation co
  • SpringBoot常用注解和原理简介说明

    转自 SpringBoot常用注解和原理简介说明 下文笔者讲述SpringBoot常见注解的简介说明 如下所示 启动注解 SpringBootApplication Target ElementType TYPE Retention Ret
  • 【j2ee系列】springmvc中使用quartz,项目启动就执行某些任务

    quartz有几种执行任务的方式 至于几种我也不知道 至少有两种吧 一种是org springframework scheduling quartz CronTriggerBean方式 配置指定的时间执行一次任务 如
  • log4j MDC用户操作日志追踪配置

    原文地址 http blog csdn net userwyh article details 52862216 一 MDC介绍 MDC Mapped Diagnostic Context 映射调试上下文 是 log4j 和 logback
  • Spring MVC 配置HttpMessageConverter和Conversion-service的问题

    最近开始学习spring mvc 配置HttpMessageConverter来转换json和xml 以及配置conversion service来格式化数据 这个两个配置总不能都测试通过 要么是第一个转换json和xml出错 格式化数据通
  • springMVC 国际化 多语言

    springMVC 国际化 多语言 配置 系统有时需要考虑多国人员使用 比如中国人 美国人 日本人 韩国人 面向不同国家的使用者应该能方便地在不同语言之间进行切换 比如中文 英文 日文 韩文 常用的有两种方式 1 根据浏览器默认语言设置系统
  • spring mvc 2.5.6配置

    兼容公司老版本项目 必须得用spring mvc2 5 6 那么问题来了 怎么配置controller都抛出no mapping的错误 经过查文档得出以下配置 仅供参考 servlet config xml
  • Spring MVC实例(增删改查)

    本文转载自 https www cnblogs com beast king p 5786752 html 作者 beast king 转载请注明该声明 数据库配置文件application context jdbc xml
  • Spring boot项目设定返回数据为JSON固定格式

    1 配置处理json的配置类 package com test config import com alibaba fastjson support spring FastJsonHttpMessageConverter import or
  • Spring MVC+Jquery Ajax 前后台传递Json对象

    关于Spring MVC3 X 接收和返回Json 最近开发项目时遇到此问题 解决后 特做下备忘 1 javabean 1 Content java public class Content implements Serializable
  • springmvc有哪几种请求参数的方式呢?

    转自 springmvc有哪几种请求参数的方式呢 传送参数至后台 是每个系统都必须面对的事实 因为系统就是一个实现人机交互的工具 那么Spring MVC中如何在后台获取参数呢 下文将一一道来 如下所示 方式一 在Controller的形参
  • Spring MVC 使用JSR303校验表单

    导入JSR303相关JAR包 Spring MVC 使用JSR303校验表单 创建registerForm jsp
  • SpringMVC中如何使用注解的方式实现文件上传呢?

    转自 SpringMVC中如何使用注解的方式实现文件上传呢 一 form表单注意事项 上传文件所处的表单 表单必须使用以下属性 enctype multipart form data method POST 二 applicationCon
  • Spring MVC 起步

    一 MVC 首先http的请求到达前端控制器 前端知道具体的请求 将代理给到控制器 控制器了解具体的业务细节 因此调用业务逻辑 生成业务数据 并将业务数据返回给前端控制器 然后前端控制器将数据分发给我们的业务视图 由业务视图来呈现业务页面返
  • 一步一步,学习如何搭建Spring+Spring MVC+MyBatis SSM框架开发环境

    目录导航 前言 一 准备工作 二 创建Maven项目 三 pom xml配置 四 配置web xml spring xml文件 五 编写Controller和相应jsp页面 六 集成mybatis 七 测试 八 TroubleShootin
  • Spring MVC视图解析器简介说明

    转自 Spring MVC视图解析器简介说明 Spring MVC视图解析器简介说明 下文讲述 Spring MVC视图 的相关说明 如下所示 Spring 视图解析器 Spring视图解析器用于对Spring中的视图进行解析 如下配置所示

随机推荐

  • Injection of autowired dependencies failed; 的解决办法!

    错误信息 严重 Exception sending context initialized event to listener instance of class org springframework web context Contex
  • 趣解面向对象

    小白自述 过去就听说 到面向对象的时候即使没有女朋友 都可以new好多个 啥时候我也能想new多少new多少 面向对象听了很多老师的课 感觉好绕啊 这个类套那个类 怎么套的也是一头雾水 怎么才能学好了面向对象嘛 好多人都说面向对象是java
  • 【Tensorflow2.0】8、tensorflow2.0_hdf5_savedmodel_pb模型转换[1]

    文章目录 1 训练模型 2 各种模型间互转并验证 2 1 hdf5转saved model 2 2 saved model转hdf5 2 3 所有模型精度测试 2 4 hdf5和saved模型转tensorflow1 x pb模型 2 5
  • Linux修改虚拟内存

    Linux机器默认swap空间 虚拟内存 为2G或更小 在运行一些大型程序如深度神经网络程序时 物理内存往往无法满足需求 可以扩大swap空间以达到正常运行的目的 主要分为6个步骤 1 创建swap文件夹 sudo mkdir usr sw
  • ospf小总结

    Ospf 开放式最短路径优先协议 Open Shortest Path First OSPF 无类别链路状态igp协议 周期更新 30min 触发更新 链路状态协议的更新量随着网络范围的扩展指数性的上升 因此ospf协议为了在中大型网络中工
  • 【cpolar、PHPStudy— 搭建企业论坛】

    公司内部搭建企业论坛 并实现在外也可以访问 文章目录 公司内部搭建企业论坛 并实现在外也可以访问 前言 1 cpolar PHPStudy 2 Discuz 3 打开PHPStudy 安装网页论坛所需软件 4 进行网页运行环境的构建 5 运
  • 关于ADMM的研究(二)

    4 Consensus and Sharing 本节讲述的两个优化问题 是非常常见的优化问题 也非常重要 我认为是ADMM算法通往并行和分布式计算的一个途径 consensus和sharing 即一致性优化问题与共享优化问题 Consens
  • Servlet的生命周期

    目录 1 Servlet的一生有这么几个阶段 2 一个Servlet从开始到消亡 1 Servlet的一生有这么几个阶段 调用构造方法进行实例化 1 构造方法 在第一次发起请求时 调用一次 public HomeServlet System
  • 61850协议服务器端开发,IEC61850中报告服务端开发

    实战的方式介绍IEC61850报告服务端的开发 本文讲述的是IEC61850中最常用的报告功能服务端的实现方法 内容包含了CID建模 编码实现 还包括后面的运行效果 MMS报文等 一 CID建模 1 通讯部分 1 1 9999 1 12 0
  • 【ReactiveX】介绍(译)

    更多内容 欢迎关注作者博客 http www china10s com blog p 465 ReactiveX 是通过使用 Observable 序列用来合成异步的和事件响应式的程序上的库文件 它扩展了通知者模式来支持数据和 或事件的响应
  • 8款超级好用的3D建模软件上下篇

    只要有水平 做出好作品 完全没问题 非也非也 做出一个好作品 不但要靠自身的技巧水平 选择适合自己的3D建模软件也是一个很重要的因素 所以小编今天就给大家安利8款好用的3D建模软件 无论你是一个0基础的初阶学者 还是想提升自己水平的进阶从业
  • 第3章-数组

    1 数组的概述 数组 Array 是多个相同类型数据按一定顺序排列 的集合 并使用一个名字命名 并通过编号的方式 对这些数据进行统一管理 数组的常见概念 数组名 下标 或索引 元素 数组的长度 数组本身是引用数据类型 而数组中的元素可以是任
  • 解决 Xshell 连接 centOs7 的Could not connect to '192.168.119.129' (port 22): Connection failed.

    在用Xshell 连接centos7的时候会遇到Could not connect to 192 168 119 129 port 22 Connection failed 这个问题 我的解决办法如下 Step1 获取 centos7 的I
  • 刷题-Leetcode-39. 组合总和(回溯-组合)

    39 组合总和 题目链接 来源 力扣 LeetCode 链接 https leetcode cn com problems combination sum submissions 著作权归领扣网络所有 商业转载请联系官方授权 非商业转载请注
  • 【手撕代码系列】JS手写实现防抖函数

    公众号 Code程序人生 分享互联网所见所闻 防抖是一种前端常见的性能优化技术 可以避免在高频触发的情况下频繁地执行函数 从而减少资源的消耗 本文将介绍如何手写实现一个防抖函数 防抖的原理 防抖的原理是当事件被触发后 计时器会被重置 如果在
  • 计算两个旋转矩形的交集——Python

    转自 https blog csdn net sda42342342423 article details 79746736 知识准备 cv2 rotatedRectangleIntersection rect1 rect2 计算两个旋转矩
  • 【C++】类和对象

    面向对象和面向过程 举个例子 淘宝这个软件 我要买一个东西 就应该有以下几步 上架商品 下单 送快递 收快递 评价 C语言关注的就是这个过程 而C 关注的更多是对象 平台 快递 用户 这就是面向对象 将上面繁琐的过程总结为三个对象 这样再来
  • Merkle树介绍

    默克尔树 Merkle树 又叫哈希树 是区块链数据存储运用到的一个重要的技术算法 简单来说 哈希树 默克尔树 中 每个节点都标有一个数据块的加密哈希值 哈希树可以用来验证任何一种在计算机中和计算机之间存储 处理和传输的数据 它们可以确保在点
  • linux ss命令详解

    ss 是 Socket Statistics 的缩写 ss 命令可以用来获取 socket 统计信息 它显示的内容和 netstat 类似 但 ss 的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息 而且比 netstat 更
  • DispatcherServlet是如何进行初始化的呢?

    转自 DispatcherServlet是如何进行初始化的呢 下文笔者讲述DispatcherServlet的初始化顺序 如下所示 Web容器启动时将调用HttpServletBean的init方法 public abstract clas