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

Spring Boot启动内嵌tocmat原理

       要研究Spring Boot启动内嵌tomcat的原理,就需要先了解一下Spring Boot自动配置的过程,首先简要的梳理一下springboot自动配置的步骤。

一、SpringBoot自动配置

      当SpringBoot应用启动时,@EnableAutoConfiguration注解被激活,该注解被包含在@SpringBootApplication中,用于启用自动配置功能。它通过扫描类路径中的META-INF/spring.factories文件,加载所有配置类。启动自动配置功能。自动配置类通常使用@Conditional系列注解(如@ConditionalOnClass、@ConditionalOnMissingBean)来控制Bean的注册行为。这些注解会根据环境条件(如类路径中是否存在特定依赖)来决定是否进行配置。核心代码如下:

        所以要探究tomcat的启动需要先研究 AutoConfiguration,toamct属于web模块,在spring-boot-atuoconfigure模块中找到web模块中的serlvert自动配置类

 

       最终定位到ServletWebServerFactoryAutoConfiguration类,这是工程模式,可以通过配置指定不同的文本容器。

二、SpringBoot创建Tomcat

       当springboot启动后扫描到ServletWebServerFactoryAutoConfiguration自动配置类的时候,进行相关的bean实例注入。

    EnableConfigurationProperties注解通过解析ServerProperties的参数,读取yml文件中用户关于server的自定义参数,@Import会导入Tomcat、Undertow 、Jetty三个内置容器,源码具体看ServletWebServerFactoryConfiguration类。由于spring-boot-starter-web,默认依赖的是spring-boot-starter-tomcat,如果配置文件不指定,默认使用的是Tomcat。

       接下来进入TomcatServletWebServerFactoryj进行分析,找到getWebServer方法

        通过 getWebServer方法实例化一个Tomcat的web容器,那么spring容器调getWebServer创建容器的时机,它的调用时机需要分析ServletWebServerApplicationContext类,这个类是spring的ioc容器的一个子类,在ioc执行refresh()方法执行onRefresh(),调用createWebServer方法创建容器:

       AbstractApplicationContext

       ServletWebServerApplicationContext

       ServletWebServerApplicationContext

       此时tomcat容器已经创建完成,那么tomcat是如何启动的呢?

 三、SpringBoot启动Tomcat

        接下来研究一下tomcat的启动时机,仍然定位到TomcatServletWebServerFactory的getWebServer方法,getTomcatWebServer方法会将Tomcat类转化成WebServer


        继续看getTomcatWebServer方法,调用TomcatWebServer的构造方法

 

       构造方法会调用initialize() 方法,在initialized的执行过程中启动tomcat

        通过源码可以看出,在创建WebServer的实例过程中启动tomcat。至此内嵌tomcat的过程分析完毕。


http://www.kler.cn/a/536996.html

相关文章:

  • 设计模式.
  • 中国城商行信贷业务数仓建设白皮书(第五期:智能决策体系构建)
  • go并发和并行
  • feign 远程调用详解
  • 【AI大模型】Ubuntu18.04安装deepseek-r1模型+服务器部署+内网访问
  • PostgreSql 函数异常处理
  • mysql的原理及经验
  • Vue3+codemirror6实现公式(规则)编辑器
  • 记录一次mysql主从
  • 【远程控制】安装虚拟显示器
  • 快速上手——.net封装使用DeekSeek-V3 模型
  • openCV函数使用(一)
  • JMeter通过BeanShell写入CSV文件中的中文乱码
  • MoviePy,利用Python自动剪辑tiktok视频
  • 【Unity 墓地和自然环境场景资产包】PBR Graveyard and Nature Set 2.0 高质量的墓地3D 模型,丰富的自然环境元素,轻松构建具有沉浸感和氛围感的游戏世界
  • 三级等保、二级等保谁更高级 ?等保都有哪些?
  • Gateway路由匹配规则详解
  • k8s网络插件及基础命令
  • LINUX——内核驱动程序
  • Python+requests实现接口自动化测试
  • 阿里云不同账号vpc对等连接
  • 文件上传全详解
  • 当春晚遇上AI,传统与科技的奇妙碰撞
  • 使用 Axios 进行高效的数据交互
  • 各种协议设计
  • (2025|Meta,LLM,token 压缩/挑选,离散潜在标记,VQ-VAE)混合潜在标记和文本标记以改进语言模型推理