淺談SpringBoot內(nèi)嵌Tomcat的實現(xiàn)原理解析
一、序言
使用SpringBoot經(jīng)常會使用內(nèi)嵌的tomcat做為項目的啟動容器,本文將從源碼的角度出發(fā),剖析SpringBoot內(nèi)嵌Tomcat的實現(xiàn)原理,討論Tomcat何時創(chuàng)建、何時啟動以及怎么啟動。
二、引入Tomcat組件
導(dǎo)入依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
項目啟動:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
以上是一段常見的SpringBoot項目依賴和啟動的代碼。引入spring-boot-starter-web同時會默認(rèn)引入spring-boot-starter-tomcat,即Tomcat啟動的相關(guān)環(huán)境。而對于項目啟動代碼,@SpringBootApplication主要實現(xiàn)Spring組件掃描和自動配置。該注解是復(fù)合注解,其中@EnableAutoConfiguration本身也是一個復(fù)合注解,包含以下內(nèi)容:
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}
這兩個注解比較關(guān)鍵。@AutoConfigurationPackage主要實現(xiàn)自動配置包,會掃描@SpringbootApplication標(biāo)注的類所在包名及其子包,將創(chuàng)建的組件添加到容器中;而@Import則是導(dǎo)入了AutoConfigurationImportSelector.class,實現(xiàn)查找classpath上所有jar包中的META-INF/spring.factories,找出其中的自動配置類并導(dǎo)入到容器中,其中Web容器所對應(yīng)的自動配置類為ServletWebServerFactoryAutoConfiguration。

ServletWebServerFactoryAutoConfiguration中支持好幾種web容器,比如Tomcat、Jetty和Undertow。

而EmbeddedTomcat則是Tomcat組件相關(guān)的類,本身是一個FactoryBean,用來實例化TomcatServletWebServerFactory。此時TomcatServletWebServerFactory中就包含了創(chuàng)建和啟動Tomcat的方法getWebServer()。

三、Tomcat組件啟動
SpringBoot是在項目啟動的時候才同時啟動Tomcat的,很顯然getWebServer()是在項目啟動的過程中調(diào)用的。跟蹤SpringApplication的run(),其中存在refreshContext(context),此時主要完成容器的刷新。

容器刷新跟蹤到最后是AbstractApplicationContext中的onRefresh(),顯然這是一個鉤子函數(shù),應(yīng)用了模板方法,查看所有的實現(xiàn)方法,其中有一個ServletWebServerApplicationContext,則是當(dāng)前Web容器的實現(xiàn)。

而ServletWebServerApplicationContext中主要是去獲得ServletWebServerFactory對象,同時調(diào)用getWebServer創(chuàng)建WebServer對象。

此時,主要處理的是Tomcat容器對象的創(chuàng)建、環(huán)境配置和啟動。


四、總結(jié)
到這里,基本就走完了內(nèi)嵌Tomcat創(chuàng)建啟動的整個流程。其實核心主要還是依賴于SpringBoot的自動配置。項目啟動的過程中,掃描classpath下的META-INF/spring.factories,實例化工廠對象TomcatServletWebServerFactory,在調(diào)用run()方法的時候完成Tomcat對象的創(chuàng)建,環(huán)境設(shè)置和啟動,從而實現(xiàn)Tomcat容器的自動化處理。
到此這篇關(guān)于淺談SpringBoot內(nèi)嵌Tomcat的實現(xiàn)原理解析的文章就介紹到這了,更多相關(guān)SpringBoot內(nèi)嵌Tomcat內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot2.2 集成 activity6實現(xiàn)請假流程(示例詳解)
這篇文章主要介紹了springboot2.2 集成 activity6實現(xiàn)請假完整流程示例詳解,本文通過示例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
使用Java8?Stream流的skip?+?limit實現(xiàn)批處理的方法
Stream 作為 Java 8 的一大亮點,它與 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念這篇文章主要介紹了使用Java8?Stream流的skip?+?limit實現(xiàn)批處理,需要的朋友可以參考下2022-07-07
手寫redis@Cacheable注解?支持過期時間設(shè)置方式
這篇文章主要介紹了手寫redis@Cacheable注解?支持過期時間設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01

