当前位置: 首页 > news >正文

【Spring MVC研究】MVC原理:DispatcherServlet的初始化,初始化好等于MVC准备好

文章目录

  • 1. @EnableWebMVC 开启 MVC 功能
  • 2. 初始化自定义的 MVC 组件
    • 2.1. 初始化过程
    • 2.2. 如何分析复杂的 Spring 组件注册
  • 3. 容器启动后会初始化 DispatcherServlet
  • 4. DispatcherServlet 初始化过程总结
  • 5. 资料参考

把DispatcherServlet 准备好意味着服务器已经可以处理请求了,那么DispatcherServlet 是如何初始化的。

1. @EnableWebMVC 开启 MVC 功能

在 Spring MVC 中可以通过贴该注解的方式来开启 MVC 功能。Spring Boot 只要引入了 web 的 starter 就已经开启了。

注意:但是在 Spring Boot 中慎重使用该注解,该注解会导致 Spring Boot 自动装配失效,所有 Boot 增强的组件全部失效,会导致功能退化为 MVC。

2. 初始化自定义的 MVC 组件

工作过程概述:
1、初始化WebMvcConfigurationSupport 中定义的各个 bean
2、各个 bean 的初始化触发DelegatingWebMvcConfiguration 各个方法的调用
3、方法的调用触发WebMvcConfigurer 的调用
4、WebMvcConfigurer 就是用户自定义的配置

2.1. 初始化过程

  • 容器启动后会开始 bean 的初始化过程。

mvc 相关的 bean 的初始化其实彼此一点关系都没有,各自初始化各自的,各自安好。但是当初始化到WebMvcConfigurationSupport中定义的Bean 的时候,会触发DelegatingWebMvcConfiguration类各个方法的调用;方法的调用又关联到WebMvcConfigurer,WebMvcConfigurer又关联到我们的组件,最后都会初始化好。

  • 初始化WebMvcConfigurationSupport 中定义的 bean
public class WebMvcConfigurationSupport implements ApplicationContextAware, ServletContextAware {......@Beanpublic RequestMappingHandlerMapping requestMappingHandlerMapping()......@Beanpublic PathMatcher mvcPathMatcher() {}......}
  • bean 的初始化导致DelegatingWebMvcConfiguration各个方法的执行
@Configuration(proxyBeanMethods = false)
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();@Autowired(required = false)public void setConfigurers(List<WebMvcConfigurer> configurers) {if (!CollectionUtils.isEmpty(configurers)) {this.configurers.addWebMvcConfigurers(configurers);}}@Overrideprotected void configurePathMatch(PathMatchConfigurer configurer) {this.configurers.configurePathMatch(configurer);}@Overrideprotected void configureContentNegotiation(ContentNegotiationConfigurer configurer) {this.configurers.configureContentNegotiation(configurer);}.........
}
  • 各个方法的执行导致WebMvcConfigurer 生效
  • 用户通过继承WebMvcConfigurer 自定义 mvc 的组件,自定义组件生效

2.2. 如何分析复杂的 Spring 组件注册

带@Bean继承关系的复杂 Spring 组件如何分析参考:https://www.yuque.com/yuchangyuan/kkc8mp/ot7orhqpmmqictqx

3. 容器启动后会初始化 DispatcherServlet

容器启动后会初始化DispatcherServlet,并把MVC相关的bean都设置到DispatcherServlet的属性中,之后处理请求只需用到属性即可。

protected void initStrategies(ApplicationContext context) {initMultipartResolver(context);initLocaleResolver(context);initThemeResolver(context);initHandlerMappings(context);initHandlerAdapters(context);initHandlerExceptionResolvers(context);initRequestToViewNameTranslator(context);initViewResolvers(context);initFlashMapManager(context);
}
  • 问题:之前的自动装配阶段不是有很多种 bean 吗,怎么现在才这么几种?

因为各个组件都整合到了这 9 种 bean 之中了。

4. DispatcherServlet 初始化过程总结

1、开启 MVC 功能

Spring Boot 只要引入 starter 即可。

2、通过@Bean 方式给容器注册相关的 mvc 组件

用户自定义一般通过实现 WebMvcConfiguration 实现

3、mvc 组件的初始化(重难点)核心类:WebMvcConfigurationSupport
4、执行DispatcherServlet 的initStrategies 方法设置属性
5、截止DispatcherServlet 准备好,MVC 就准备好了
6、之后的 http 请求直接在DispatcherServlet 处理即可。

1、先 service 方法(该方法会准备一些东西)
2、后 doDispatcher 方法(核心处理请求的方法)

5. 资料参考

Spring MVC源码分析:https://gitee.com/firefish985/article-list/tree/master/Spring/Spring Web MVC

http://www.lryc.cn/news/186685.html

相关文章:

  • Kafka的分布式架构与高可用性
  • Spring Cloud学习笔记【分布式请求链路跟踪-Sleuth】
  • Java开发中的操作日志详解(InsCode AI 创作助手)
  • FutureTask和CompletableFuture的模拟使用
  • Redis作为缓存,mysql的数据如何与redis进行同步?
  • 申请免费 SSL 证书为您的小程序加密通信
  • Go 并发编程
  • 鱼眼相机去畸变(图像拉直/展开/矫正)算法及实战总结
  • es6 数据类型
  • 【postgresql】
  • 【C++】空间配置器 allocator:原理及底层解析
  • 微信小程序 movable-area 区域拖动动态组件演示
  • 隔离上网,安全上网
  • NOSQL Redis 数据持久化 RDB、AOF(二) 恢复
  • UDP通信
  • Bootstrap对溢出内容的两种处理:滚动条和隐藏两种方式
  • elasticsearch基本语法
  • Maven Spring jar包启动报错 排查
  • LeetCode-2485-找出中枢整数
  • nano pi m1配置脚本(全志H3)
  • linux--gdb的使用
  • JVM命令行监控工具
  • 系统架构设计:4 论微服务架构及其应用
  • 【C++设计模式之建造者模式:创建型】分析及示例
  • C++day03(动态内存、类中特殊成员函数)
  • 【Leetcode】179. 最大数
  • ArduPilot开源飞控之AP_Baro_MSP
  • openGauss学习笔记-94 openGauss 数据库管理-访问外部数据库-mysql_fdw
  • UML图 - 类图(Class Diagram)
  • sheng的学习笔记-【中文】【吴恩达课后测验】Course 2 - 改善深层神经网络 - 第二周测验