淺談SpringBoot內(nèi)嵌Tomcat的實現(xiàn)原理解析
一、序言
使用SpringBoot經(jīng)常會使用內(nèi)嵌的tomcat做為項目的啟動容器,本文將從源碼的角度出發(fā),剖析SpringBoot內(nèi)嵌Tomcat的實現(xiàn)原理,討論Tomcat何時創(chuàng)建、何時啟動以及怎么啟動。
二、引入Tomcat組件
導入依賴:
<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
同時會默認引入spring-boot-starter-tomcat
,即Tomcat啟動的相關環(huán)境。而對于項目啟動代碼,@SpringBootApplication
主要實現(xiàn)Spring組件掃描和自動配置。該注解是復合注解,其中@EnableAutoConfiguration
本身也是一個復合注解,包含以下內(nèi)容:
@AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { }
這兩個注解比較關鍵。@AutoConfigurationPackage
主要實現(xiàn)自動配置包,會掃描@SpringbootApplication
標注的類所在包名及其子包,將創(chuàng)建的組件添加到容器中;而@Import
則是導入了AutoConfigurationImportSelector.class,實現(xiàn)查找classpath上所有jar包中的META-INF/spring.factories,找出其中的自動配置類并導入到容器中,其中Web容器所對應的自動配置類為ServletWebServerFactoryAutoConfiguration。
ServletWebServerFactoryAutoConfiguration中支持好幾種web容器,比如Tomcat、Jetty和Undertow。
而EmbeddedTomcat則是Tomcat組件相關的類,本身是一個FactoryBean,用來實例化TomcatServletWebServerFactory。此時TomcatServletWebServerFactory中就包含了創(chuàng)建和啟動Tomcat的方法getWebServer()。
三、Tomcat組件啟動
SpringBoot是在項目啟動的時候才同時啟動Tomcat的,很顯然getWebServer()是在項目啟動的過程中調(diào)用的。跟蹤SpringApplication的run(),其中存在refreshContext(context),此時主要完成容器的刷新。
容器刷新跟蹤到最后是AbstractApplicationContext中的onRefresh(),顯然這是一個鉤子函數(shù),應用了模板方法,查看所有的實現(xiàn)方法,其中有一個ServletWebServerApplicationContext,則是當前Web容器的實現(xiàn)。
而ServletWebServerApplicationContext中主要是去獲得ServletWebServerFactory對象,同時調(diào)用getWebServer創(chuàng)建WebServer對象。
此時,主要處理的是Tomcat容器對象的創(chuàng)建、環(huán)境配置和啟動。
四、總結
到這里,基本就走完了內(nèi)嵌Tomcat創(chuàng)建啟動的整個流程。其實核心主要還是依賴于SpringBoot的自動配置。項目啟動的過程中,掃描classpath下的META-INF/spring.factories,實例化工廠對象TomcatServletWebServerFactory,在調(diào)用run()方法的時候完成Tomcat對象的創(chuàng)建,環(huán)境設置和啟動,從而實現(xiàn)Tomcat容器的自動化處理。
到此這篇關于淺談SpringBoot內(nèi)嵌Tomcat的實現(xiàn)原理解析的文章就介紹到這了,更多相關SpringBoot內(nèi)嵌Tomcat內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Springboot 讀取 yml 配置文件里的參數(shù)值
本文主要介紹了Springboot 讀取 yml 配置文件里的參數(shù)值,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12Mybatis的mapper標簽 namespace屬性用法說明
這篇文章主要介紹了Mybatis的mapper標簽 namespace屬性用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09