要研究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的过程分析完毕。