idea servlet自动配置web.xml_Spring Boot学习04_嵌入式Servlet容器自动配置原理
在Spring Boot的自动配置包下,找到web模块中的servlet文件夹下的ServletWebServerFactoryConfiguration类
一、嵌入式Servlet容器默认的配置原理
1、该类中有三个静态内部类(都是配置类):
EmbeddedUndertow、EmbeddedJetty、EmbeddedTomcat
这里拿EmbeddedTomcat来举例说明
@ConditionalOnClass({Servlet.class, Tomcat.class, UpgradeProtocol.class})
判断classpath下有没有Servlet, Tomcat, UpgradeProtocol这三个类,也就是看maven有没有引入对应的依赖,如果引入了对应的依赖,下面的配置就生效。(上一篇文章SpringBoot切换嵌入式容器就是根据这里来的链接)
![](/assets/blank.gif)
2、@ConditionalOnMissingBean(
value = {ServletWebServerFactory.class},
search = SearchStrategy.CURRENT
)
如果容器中没有ServletWebServerFactory这个组件下面的配置就生效
点进ServletWebServerFactory看,该接口只有一个方法,前面只判断这个类型的组件有没有在容器中,而该类型又只有一个方法,说明最终Spring Boot会调用该接口实现类中的getWebServer方法。
![](/assets/blank.gif)
![](/assets/blank.gif)
3、查看ServletWebServerFactory接口的实现,有三个很面熟的实现类,就是上面ServletWebServerFactoryConfiguration类中要往容器中添加的组件
![](/assets/blank.gif)
![](/assets/blank.gif)
4、进入TomcatServletWebServerFactory类中查看getWebServer方法
首先会创建一个Tomcat对象,给其设置连接器等一些配置
最终还会调用getTomcatWebServer方法
this.getTomcatWebServer(tomcat);
-->return new TomcatWebServer(tomcat, this.getPort() >= 0);
端口号默认是8080所以上面传过去的是true,进入TomcatWebServer的构造方法TomcatWebServer中,在构造方法中又调用了this.initialize();进入initialize方法,该方法就会启动tomcat。(所以这一切都是建立在创建好嵌入式Servlet容器之后)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
二、修改SpringBoot初始化嵌入式Servlet容器的默认配置原理
上一篇文章(链接)中我们自己配置个WebServerFactoryCustomizer<ConfigurableWebServerFactory>组件就可以实现修改SpringBoot初始化嵌入式Servlet容器的默认配置了,下面开始说怎么修改其默认配置的。
在ServletWebServerFactoryAutoConfiguration类上面有
@EnableConfigurationProperties,@Import注解
![](/assets/blank.gif)
1、@EnableConfigurationProperties({ServerProperties.class})
把ServerProperties注册到容器中,并读取全局配置文件中的数据赋值给类中的属性。
只有一个有参构造,形参的值(serverProperties)会从容器中获取,最终交给ServletWebServerFactoryCustomizer类,进入ServletWebServerFactoryCustomizer类
该类也是WebServerFactoryCustomizer的子类
里面有个customize方法会把从容器中获取到的servlerProperties中的值拿出来然后一个一个的设置给factory,最后交给那个map。
![](/assets/blank.gif)
![](/assets/blank.gif)
2.1、通过@Import往容器中导入了一个BeanPostProcessorsRegistrar类,该类中的作用是
bean注册后置处理器:Bean初始化前后(创建好对象,还没赋值)执行初始化工作(容器中某个组件要创建bean,就会惊动后置处理器,容器中要创建bean这个才会触发,下面的方法才会被调用)
![](/assets/blank.gif)
2.2、进入BeanPostProcessorsRegistrar类查看registerBeanDefinitions方法(注册bean的定义),然后调用registerSyntheticBeanIfMissing方法
![](/assets/blank.gif)
2.3、我们点进WebServerFactoryCustomizerBeanPostProcessor类中只需要看postProcessBeforeInitialization方法,在bean创建好之后,初始化之前的调用的方法,该方法首先会判断当前的bean如果为WebServerFactory类型(我们前面需要往容器中注册三个嵌入式Servlet容器就是该接口的实现类,所以当前这个bean就是嵌入式的Servlet容器),就调用postProcessBeforeInitialization方法
![](/assets/blank.gif)
2.4、进入postProcessBeforeInitialization方法,该方法会获得所有的定制器,然后遍历,调用每个定制器的customize方法,并把嵌入式的Servlet容器传进去。
上一篇文章(链接)中我们修改嵌入式的Servlet容器的配置也是往容器中添加一个WebServerFactoryCustomizer组件,并在其customize方法中修改配置。
在前面说到通过配置文件来修改配置也是在WebServerFactoryCustomizer的子类中重写了
customize方法,并在其customize方法中修改配置。
回到这里的postProcessBeforeInitialization方法,我们这里把嵌入式的Servlet容器传过去,调用所有定制器的customize方法,不就是调用的上面两种修改配置的重写后的customize方法吗,我们在重写后的customize方法中对参数进行设置值,就是对我们这里传过去的嵌入式Servlet容器设置值,最终通过全局配置文件中配置和往容器中添加一个WebServerFactoryCustomizer组件就可以达到修改嵌入式的Servlet容器的默认值了
![](/assets/blank.gif)
![](/assets/blank.gif)
往容器中添加一个WebServerFactoryCustomizer组件
![](/assets/blank.gif)
前面说到的,经过一系列的逻辑最终全局配置文件中的值会在这里给嵌入式的Servlet容器进行赋值
![](/assets/blank.gif)
注:看完这一篇文章要结合下一篇文章来理解
idea servlet自动配置web.xml_Spring Boot学习04_嵌入式Servlet容器自动配置原理相关推荐
- Java Spring Boot 2.0实战Docker容器与架构原理,视频与课件,基于Linux环境...
Java Spring Boot 2.0实战Docker容器Linux与架构原理 内容摘要:Docker是最流行的开源容器引擎,Go语言开发,在互联网大规模集群.云计算.微服务等架构中广泛使用.本次课 ...
- 学c语言 pr用什么电脑配置,【答疑】学习python需要怎样的电脑配置? - 视频教程线上学...
lumion 9.0需要电脑配置 2019-03-08 浏览量:11497 提问者:小曼 回答: 下面是我大力推荐的一套lumion 9.0的电脑配置,预算大概一万左右,运行起来毫无压力.CPUInt ...
- 【CJY学习笔记】Redis容器的配置
1.创建Redis的docker容器 Docker 创建 Redis 容器命令 docker run \ -d \ --name redis \ -p 6379:6379 \ --restart un ...
- spring boot 学习之五(日志配置)
想直接看这里的我建议先看了我的spring boot 学习之四.因为日志的配置要用到properties. 先了解一下springBoot的日志系统然后再进行配置. springboot默认采用的是s ...
- SpringBoot之配置嵌入式Servlet容器
1.概述 文章目录 1.概述 2.如何修改SpringBoot的默认配置 3.定制和修改Servlet容器的相关配置 4.注册Servlet三大组件 5.替换为其他嵌入式Servlet容器 6.嵌入式 ...
- Spring boot嵌入式Servlet容器定制器
修改Servlet配置 可以通过配置文件修改 也可以编写一个嵌入式Servlet容器定制器 EmbeddedServletContainerCustomizer 在自定义配置中,添加组件 Embedd ...
- 学习python实现问卷星自动填写问卷
学习python实现问卷星自动填写问卷 文章目录 学习python实现问卷星自动填写问卷 任务一:找帖子 思路一: 配置环境: 利用CSS选择器对页面进行解析 我们发现,我们所有的题目的回答的选项的标 ...
- 【Arduino学习笔记】系列1 - 定时器配置
目录 一.Arduino定时器简介 二.定时器基本概念 定时器速度(HZ) = Arduino时钟速度(16MHz) / 预分频器系数 中断频率(Hz)=(Arduino时钟速度16MHz)/(预分频 ...
- Openvino学习之openvino2022.1版安装配置
Openvino学习之openvino2022.1版安装配置 文章目录 Openvino学习之openvino2022.1版安装配置 前言 一.从安装角度看新版本的变化 二.安装 1.官网地址 2.安 ...
最新文章
- 智能车竞赛技术报告 | 专科基础组 - 哈尔滨铁道职业技术学院 - 智能车勇创协会
- 如何优化移动端的网站排名?
- 传统生成API文档弊端
- 监听以太网(二) Packet32包说明
- 本周Java技巧#7 – Maven慢吗?
- MVC路由中routes.IgnoreRoute({resource}.axd/{*pathInfo}) 到底什么意思!
- rapidxml在qt linux(gcc)下写xml文件出错
- “知识图谱+”系列:知识图谱+强化学习
- nodejs基于art-template模板引擎生成
- Python的主要8大应用领域,你还不会吗?
- multisim安装后无法连接数据库_Win10系统安装ChemWindow后无法运行的解决方法
- String、StringBuffer、StringBuilder之间的区别 简明介绍
- 网站生成静态页面,及网站数据采集的攻、防原理和策略
- iphone之使用讯飞语音sdk实现语音识别功能
- promise的链式调用
- Python学习教程:爬虫分析了京东内衣销售记录,哪个size最多?
- java删除文件夹及下面的所有文件
- 张靓颖同学2006年日程表
- android华为隐藏底部虚拟按键,沉浸式状态栏/华为虚拟按键隐藏
- 用户体验五要素_【产品经理】如何理解“用户体验要素”5层模型?
热门文章
- obj,lib,dll,exe
- C++运行时候库操作概述和整个程序运行流程
- deepin--安装Anaconda
- Caffe官方教程翻译(5):Classification: Instant Recognition with Caffe
- 场景法设计测试用例atm_测试用例设计经典面试题之电梯、杯子、笔、桌子、洗衣机、椅子、ATM等...
- 使用Celery踩过的坑
- 【Java框架】 Hibernate与Mybatis对比
- 深入学习微框架:Spring Boot
- shell脚本安装mysql并安装一个小服务
- 显示ip地址及包含采集功能的全套函数源代码