欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > Spring Boot启动内嵌tocmat原理

Spring Boot启动内嵌tocmat原理

2025/2/8 11:39:25 来源:https://blog.csdn.net/fengchengwu2012/article/details/145474210  浏览:    关键词: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的过程分析完毕。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com