在Spring Boot的自动配置包下,找到web模块中的servlet文件夹下的ServletWebServerFactoryConfiguration类

一、嵌入式Servlet容器默认的配置原理

1、该类中有三个静态内部类(都是配置类):

EmbeddedUndertow、EmbeddedJetty、EmbeddedTomcat

这里拿EmbeddedTomcat来举例说明

@ConditionalOnClass({Servlet.class, Tomcat.class, UpgradeProtocol.class})

判断classpath下有没有Servlet, Tomcat, UpgradeProtocol这三个类,也就是看maven有没有引入对应的依赖,如果引入了对应的依赖,下面的配置就生效。(上一篇文章SpringBoot切换嵌入式容器就是根据这里来的链接

2、@ConditionalOnMissingBean(
value = {ServletWebServerFactory.class},
search = SearchStrategy.CURRENT
)

如果容器中没有ServletWebServerFactory这个组件下面的配置就生效

点进ServletWebServerFactory看,该接口只有一个方法,前面只判断这个类型的组件有没有在容器中,而该类型又只有一个方法,说明最终Spring Boot会调用该接口实现类中的getWebServer方法。

3、查看ServletWebServerFactory接口的实现,有三个很面熟的实现类,就是上面ServletWebServerFactoryConfiguration类中要往容器中添加的组件

4、进入TomcatServletWebServerFactory类中查看getWebServer方法

首先会创建一个Tomcat对象,给其设置连接器等一些配置

最终还会调用getTomcatWebServer方法

this.getTomcatWebServer(tomcat);

-->return new TomcatWebServer(tomcat, this.getPort() >= 0);

端口号默认是8080所以上面传过去的是true,进入TomcatWebServer的构造方法TomcatWebServer中,在构造方法中又调用了this.initialize();进入initialize方法,该方法就会启动tomcat。(所以这一切都是建立在创建好嵌入式Servlet容器之后)


二、修改SpringBoot初始化嵌入式Servlet容器的默认配置原理

上一篇文章(链接)中我们自己配置个WebServerFactoryCustomizer<ConfigurableWebServerFactory>组件就可以实现修改SpringBoot初始化嵌入式Servlet容器的默认配置了,下面开始说怎么修改其默认配置的。

在ServletWebServerFactoryAutoConfiguration类上面有

@EnableConfigurationProperties,@Import注解

1、@EnableConfigurationProperties({ServerProperties.class})

把ServerProperties注册到容器中,并读取全局配置文件中的数据赋值给类中的属性。

只有一个有参构造,形参的值(serverProperties)会从容器中获取,最终交给ServletWebServerFactoryCustomizer类,进入ServletWebServerFactoryCustomizer类

该类也是WebServerFactoryCustomizer的子类

里面有个customize方法会把从容器中获取到的servlerProperties中的值拿出来然后一个一个的设置给factory,最后交给那个map。

2.1、通过@Import往容器中导入了一个BeanPostProcessorsRegistrar类,该类中的作用是

bean注册后置处理器:Bean初始化前后(创建好对象,还没赋值)执行初始化工作(容器中某个组件要创建bean,就会惊动后置处理器,容器中要创建bean这个才会触发,下面的方法才会被调用)

2.2、进入BeanPostProcessorsRegistrar类查看registerBeanDefinitions方法(注册bean的定义),然后调用registerSyntheticBeanIfMissing方法

2.3、我们点进WebServerFactoryCustomizerBeanPostProcessor类中只需要看postProcessBeforeInitialization方法,在bean创建好之后,初始化之前的调用的方法,该方法首先会判断当前的bean如果为WebServerFactory类型(我们前面需要往容器中注册三个嵌入式Servlet容器就是该接口的实现类,所以当前这个bean就是嵌入式的Servlet容器),就调用postProcessBeforeInitialization方法

2.4、进入postProcessBeforeInitialization方法,该方法会获得所有的定制器,然后遍历,调用每个定制器的customize方法,并把嵌入式的Servlet容器传进去。

上一篇文章(链接)中我们修改嵌入式的Servlet容器的配置也是往容器中添加一个WebServerFactoryCustomizer组件,并在其customize方法中修改配置。

在前面说到通过配置文件来修改配置也是在WebServerFactoryCustomizer的子类中重写了

customize方法,并在其customize方法中修改配置。

回到这里的postProcessBeforeInitialization方法,我们这里把嵌入式的Servlet容器传过去,调用所有定制器的customize方法,不就是调用的上面两种修改配置的重写后的customize方法吗,我们在重写后的customize方法中对参数进行设置值,就是对我们这里传过去的嵌入式Servlet容器设置值,最终通过全局配置文件中配置和往容器中添加一个WebServerFactoryCustomizer组件就可以达到修改嵌入式的Servlet容器的默认值了

往容器中添加一个WebServerFactoryCustomizer组件

前面说到的,经过一系列的逻辑最终全局配置文件中的值会在这里给嵌入式的Servlet容器进行赋值

注:看完这一篇文章要结合下一篇文章来理解

idea servlet自动配置web.xml_Spring Boot学习04_嵌入式Servlet容器自动配置原理相关推荐

  1. Java Spring Boot 2.0实战Docker容器与架构原理,视频与课件,基于Linux环境...

    Java Spring Boot 2.0实战Docker容器Linux与架构原理 内容摘要:Docker是最流行的开源容器引擎,Go语言开发,在互联网大规模集群.云计算.微服务等架构中广泛使用.本次课 ...

  2. 学c语言 pr用什么电脑配置,【答疑】学习python需要怎样的电脑配置? - 视频教程线上学...

    lumion 9.0需要电脑配置 2019-03-08 浏览量:11497 提问者:小曼 回答: 下面是我大力推荐的一套lumion 9.0的电脑配置,预算大概一万左右,运行起来毫无压力.CPUInt ...

  3. 【CJY学习笔记】Redis容器的配置

    1.创建Redis的docker容器 Docker 创建 Redis 容器命令 docker run \ -d \ --name redis \ -p 6379:6379 \ --restart un ...

  4. spring boot 学习之五(日志配置)

    想直接看这里的我建议先看了我的spring boot 学习之四.因为日志的配置要用到properties. 先了解一下springBoot的日志系统然后再进行配置. springboot默认采用的是s ...

  5. SpringBoot之配置嵌入式Servlet容器

    1.概述 文章目录 1.概述 2.如何修改SpringBoot的默认配置 3.定制和修改Servlet容器的相关配置 4.注册Servlet三大组件 5.替换为其他嵌入式Servlet容器 6.嵌入式 ...

  6. Spring boot嵌入式Servlet容器定制器

    修改Servlet配置 可以通过配置文件修改 也可以编写一个嵌入式Servlet容器定制器 EmbeddedServletContainerCustomizer 在自定义配置中,添加组件 Embedd ...

  7. 学习python实现问卷星自动填写问卷

    学习python实现问卷星自动填写问卷 文章目录 学习python实现问卷星自动填写问卷 任务一:找帖子 思路一: 配置环境: 利用CSS选择器对页面进行解析 我们发现,我们所有的题目的回答的选项的标 ...

  8. 【Arduino学习笔记】系列1 - 定时器配置

    目录 一.Arduino定时器简介 二.定时器基本概念 定时器速度(HZ) = Arduino时钟速度(16MHz) / 预分频器系数 中断频率(Hz)=(Arduino时钟速度16MHz)/(预分频 ...

  9. Openvino学习之openvino2022.1版安装配置

    Openvino学习之openvino2022.1版安装配置 文章目录 Openvino学习之openvino2022.1版安装配置 前言 一.从安装角度看新版本的变化 二.安装 1.官网地址 2.安 ...

最新文章

  1. 智能车竞赛技术报告 | 专科基础组 - 哈尔滨铁道职业技术学院 - 智能车勇创协会
  2. 如何优化移动端的网站排名?
  3. 传统生成API文档弊端
  4. 监听以太网(二) Packet32包说明
  5. 本周Java技巧#7 – Maven慢吗?
  6. MVC路由中routes.IgnoreRoute({resource}.axd/{*pathInfo}) 到底什么意思!
  7. rapidxml在qt linux(gcc)下写xml文件出错
  8. “知识图谱+”系列:知识图谱+强化学习
  9. nodejs基于art-template模板引擎生成
  10. Python的主要8大应用领域,你还不会吗?
  11. multisim安装后无法连接数据库_Win10系统安装ChemWindow后无法运行的解决方法
  12. String、StringBuffer、StringBuilder之间的区别 简明介绍
  13. 网站生成静态页面,及网站数据采集的攻、防原理和策略
  14. iphone之使用讯飞语音sdk实现语音识别功能
  15. promise的链式调用
  16. Python学习教程:爬虫分析了京东内衣销售记录,哪个size最多?
  17. java删除文件夹及下面的所有文件
  18. 张靓颖同学2006年日程表
  19. android华为隐藏底部虚拟按键,沉浸式状态栏/华为虚拟按键隐藏
  20. 用户体验五要素_【产品经理】如何理解“用户体验要素”5层模型?

热门文章

  1. obj,lib,dll,exe
  2. C++运行时候库操作概述和整个程序运行流程
  3. deepin--安装Anaconda
  4. Caffe官方教程翻译(5):Classification: Instant Recognition with Caffe
  5. 场景法设计测试用例atm_测试用例设计经典面试题之电梯、杯子、笔、桌子、洗衣机、椅子、ATM等...
  6. 使用Celery踩过的坑
  7. 【Java框架】 Hibernate与Mybatis对比
  8. 深入学习微框架:Spring Boot
  9. shell脚本安装mysql并安装一个小服务
  10. 显示ip地址及包含采集功能的全套函数源代码