一节在springboot中配置了servlet三大组件以及嵌入式servlet容器,并且还简单的说了如何切换不同的容器。

这一节就来说说如何改变servlet容器的配置参数,一般有两种常见的方式,第一种:配置文件(properties和yml);第二种:往容器里添加组件的方式

注意注意:我这里说的容器和嵌入式容器不一样的,容器指的是ioc容器,嵌入式servlet容器值得是servlet容器,不要混淆了

欢迎工作一到八年的Java工程师朋友们加入Java高级交流群:854630135

本群提供免费的学习指导 架构资料 以及免费的解答

不懂得问题都可以在本群提出来 之后还会有直播平台和讲师直接交流噢

哦对了,喜欢就别忘了关注一下哦~

1.通过配置文件的方式配置

yml为例,下图所示,这是配置容器启动的端口

而且我们可以点开这个端口,可以发现

而这个ServerProperties的很多属性,port,adress,serverPath等等都可以在配置文件中server.xxx=xxxxx进行修改。

在这个类中,起作用的主要是这个customize方法来设置容器的属性

2.通过嵌入式servlet容器定制器设置(这种配置比上面优先级高)

随便找个配置类,如下代码(也可以配置其他属性,我用最简单的port演示一下)

可以启动容器,看控制台,8082端口,启动成功,而且覆盖了yml配置的8080端口,这种方式的优先级更高。

3.一起来剖析原理(Tomcat为例)

我们可以发现这两种的本质是一样的,最终都是向容器里添加一个嵌入式servlet容器定制器,执行其中的customize方法。

那么,我们从哪里入手呢?(不用想,肯定是自动配置类啊,记住,一切配置入手都是从自动配置类开始)

打开一个叫做EmbeddedServletContainerAutoConfiguration的类,翻译就叫做嵌入式servlet容器自动配置。

重点是这个自动配置类里面的配置(就以默认的tomcat为例)

只要添加了tomcat的依赖,会为ioc容器里面添加Tomcat的嵌入式servlet容器工厂,打开这个容器工厂

点开这个类之后。我们主要看这里

一直到这里,tomcat的配置都过了一遍,总结一下啊:只要EmbeddedServletContainerAutoConfiguration这个配置类生效------->向ioc容器导入TomcatEmbeddedServletContainerFactory组件---------->这个tomcat嵌入式容器工厂里面会创建正常Tomcat容器对象---------->然后进行封装成嵌入式类型的容器,内部会直接启动Tomcat,从这里可以大概看出来先启动的ioc容器,然后再是Tomcat容器

是不是还忘记了前面说的,这个自动配置类要起作用,会提前在ioc容器中导入一个注册器,这个组件很关键,他会在EmbeddedServletContainerAutoConfiguration自动配置类之前先给容器中注册一些后置处理器,而后面再ioc容器中满足条件的Bean创建对象但是还没有赋值的时候,会做一些准备工作,下面我们打开这个注册器BeanPostProcessorsRegistrar,看看注册了哪些后置处理器(BeanPostProcessors),打开这个来,看这里

打开这个嵌入式servlet容器定制器的后置处理器(这个单词够长......),打来这个很长的后置处理器,看这个方法

到这里就差不多了,一个很大的循环,和最开始的嵌入式servlet容器定制器链接起来了,哈哈,剖析了清楚了,还是很容易的,而且,上图中我们还可以看看getCustomizers()是怎么获取所有的定制器的,点开这个方法

最后这个是一个简单的方法,就是容器中按照某种类型获取某些组件,然后保存起来,供别的方法遍历,每一个都去执行一个方法,这种模式在springboot中大量的可以看到。

因为这一节东西比较多,我就总结一下。

总结全过程:启动springboot应用,创建ioc容器(这个过程我也会找个时间好好说一下ioc容器创建全过程,这里暂时掠过)---------->刷新ioc容器----------->会导入很多的自动配置类,其中就有一个EmbeddedServletContainerAutoConfiguration,这个配置类起作用,又会往ioc容器中导入后置处理器的注册器(BeanPostProcessorsRegistrar)向容器中导入那个很长的后置处理器(EmbeddedServletContainerCustomizerBeanPostProcessor),还会导入tomcat容器工厂(TomcatEmbeddedServletContainerFactory)----------->在这个容器工厂内部就会创建tomcat容器,然后进行一些参数的配置,再包装成嵌入式tomcat,同时我们配置的嵌入式容器定制器(EmbeddedServletContainerCustomizer)加载到ioc容器里,这个时候就会触发那个很长的后置处理器去拿到容器里所有的嵌入式容器定制器,遍历,执行customize方法也为嵌入式tomcat配置一些参数(当然,这些配置是我们写的,优先级更高)---------->tomcat启动

哎,水平有限只能分析到这里,还是说一句,这里只是粗略的说了一下原理,真实情况下会更加复杂,等我什么时候水平到了,再继续分析吧!

带着萌新看springboot源码02相关推荐

  1. java小新人 带着萌新看springboot源码

      这节来说个大家都比较熟悉的东西,就是servlet三大组件,servlet.filter.listener,再说说springboot的内置tomcat.   也许还会说一下tomcat的运行原理 ...

  2. 小编带着小白看springboot源码2

    上一节讲到先创建maven项目,然后导入依赖,主配置类等步骤,现在来个快速创建一个springboot模板,不需要向上节那么繁琐. 1.快速创建springboot应用   IDEA---->f ...

  3. spring-boot-2.0.3不一样系列之源码篇 - springboot源码一,绝对有值得你看的地方

    前言 上篇:spring-boot-2.0.3不一样系列之shiro - 搭建篇,实现了spring-boot与shiro的整合,效果大家也看到了,工程确实集成了shiro的认证与授权功能.如果大家能 ...

  4. 不会部署并调试SpringBoot源码?一看必会IDEA操作

    专题系列分类:玩转SpringBoot2.x系列教程 前言 你是否遇在面试中遇到如下提问: 面试官:了解过SpringBoot 的源码吗 ? 我:- 没有. 面试官:下一位. 当你从面试公司出来后,你 ...

  5. 一点一点看JDK源码(四)java.util.ArrayList 中篇

    一点一点看JDK源码(四)java.util.ArrayList 中篇 liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 在前篇中 ...

  6. 面试官系统精讲Java源码及大厂真题 - 41 突破难点:如何看 Lambda 源码

    41 突破难点:如何看 Lambda 源码 引导语 大家都知道 Java8 中新增了 Lambda 表达式,使用 Lambda 表达式可以对代码进行大量的优化,用几行代码就可以做很多事情,本章以 La ...

  7. Springboot源码分析第一弹 - 自动装配实现

    Springboot就不用多了吧,解放Java开发双手的神器. 最显著的特点就是,去配置化,自动装配,自动配置.让开发人员只需要注重业务的开发 今天就来了解一下自动装配的源码是怎么实现的 预先准备 直 ...

  8. springboot源码编译

    maven实战 一. maven编译springboot源码 0. 环境 jdk1.8 maven 3.6.0 gradle 4.10.3 (建议下载,后面说为什么)下载地址 IDEA 2019专业版 ...

  9. HTML网页设计制作大作业(div+css) ~中华美德6页面带音乐 ~ 学生网页设计作业源码(中华文化)

    HTML网页设计制作大作业(div+css) ~ 中华美德6页面带音乐 ~ 学生网页设计作业源码(中华文化) 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从 ...

最新文章

  1. SQL Server 数据库设计
  2. 力扣: 268. 丢失的数字
  3. Android 文件的存储和加载
  4. java == 如何避免空指针异常
  5. HTML用css让input无法使用,html – 是否可以使用CSS设置一个禁用的INPUT元素?
  6. C# const与readonly的用法和区别解析(转)
  7. Nodejs - 如何用 eventproxy 模块控制并发
  8. axios java 参数,vue.js axios发请求时,参数包括dto和一个flag, 后台如何接?
  9. python安装与配置虚拟环境包_python 虚拟环境配置及pypi包使用及包怎么
  10. windows10计算机用户密码,忘记Windows 10系统密码?教你重置
  11. 20155238 2016-2017-2 《Java程序设计》第六周学习总结
  12. 详细解读Python中的__init__()方法
  13. java语法和python语法的一些区别
  14. springboot项目linux系统设置开机启动项(亲测可用)
  15. Airtest  入门
  16. win7系统安装记录
  17. 手机的 32K,26M时钟电路作用 (转载于 52rd zsqt8888的专栏)
  18. LaTeX命令速查手册 - 方法总比问题多
  19. server sql 本月最后一天_SQL SERVER中求上月、本月和下月的第一天和最后一天 DATEADD DATEDIFF...
  20. angr.state_plugins.unicorn_engine | failed loading “angr_native.dylib“, unicorn support disabled

热门文章

  1. 数电实验(组合逻辑电路、时序电路,555定时器)
  2. Substrate 技术及生态6月大事记 | Polkadot Decoded 圆满落幕,黑客松获胜项目为生态注入新生力量
  3. PMSM学习(4)——控制方式总结
  4. HDU 2222(AC自动机模板)
  5. kafka:过期数据清理
  6. gmap 支持python吗_GMAP使用
  7. 笔记本外放无声而带上耳机有声的解决办法
  8. iOS NSLog使用技巧
  9. 通过运行命令services.msc快速打开服务和注册
  10. 跟小丸子学基础口语4-10