淺談SpringBoot內(nèi)嵌Tomcat的實(shí)現(xiàn)原理解析
一、序言
使用SpringBoot經(jīng)常會(huì)使用內(nèi)嵌的tomcat做為項(xiàng)目的啟動(dòng)容器,本文將從源碼的角度出發(fā),剖析SpringBoot內(nèi)嵌Tomcat的實(shí)現(xiàn)原理,討論Tomcat何時(shí)創(chuàng)建、何時(shí)啟動(dòng)以及怎么啟動(dòng)。
二、引入Tomcat組件
導(dǎo)入依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
項(xiàng)目啟動(dòng):
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
以上是一段常見的SpringBoot項(xiàng)目依賴和啟動(dòng)的代碼。引入spring-boot-starter-web
同時(shí)會(huì)默認(rèn)引入spring-boot-starter-tomcat
,即Tomcat啟動(dòng)的相關(guān)環(huán)境。而對(duì)于項(xiàng)目啟動(dòng)代碼,@SpringBootApplication
主要實(shí)現(xiàn)Spring組件掃描和自動(dòng)配置。該注解是復(fù)合注解,其中@EnableAutoConfiguration
本身也是一個(gè)復(fù)合注解,包含以下內(nèi)容:
@AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { }
這兩個(gè)注解比較關(guān)鍵。@AutoConfigurationPackage
主要實(shí)現(xiàn)自動(dòng)配置包,會(huì)掃描@SpringbootApplication
標(biāo)注的類所在包名及其子包,將創(chuàng)建的組件添加到容器中;而@Import
則是導(dǎo)入了AutoConfigurationImportSelector.class,實(shí)現(xiàn)查找classpath上所有jar包中的META-INF/spring.factories,找出其中的自動(dòng)配置類并導(dǎo)入到容器中,其中Web容器所對(duì)應(yīng)的自動(dòng)配置類為ServletWebServerFactoryAutoConfiguration。
ServletWebServerFactoryAutoConfiguration中支持好幾種web容器,比如Tomcat、Jetty和Undertow。
而EmbeddedTomcat則是Tomcat組件相關(guān)的類,本身是一個(gè)FactoryBean,用來實(shí)例化TomcatServletWebServerFactory。此時(shí)TomcatServletWebServerFactory中就包含了創(chuàng)建和啟動(dòng)Tomcat的方法getWebServer()。
三、Tomcat組件啟動(dòng)
SpringBoot是在項(xiàng)目啟動(dòng)的時(shí)候才同時(shí)啟動(dòng)Tomcat的,很顯然getWebServer()是在項(xiàng)目啟動(dòng)的過程中調(diào)用的。跟蹤SpringApplication的run(),其中存在refreshContext(context),此時(shí)主要完成容器的刷新。
容器刷新跟蹤到最后是AbstractApplicationContext中的onRefresh(),顯然這是一個(gè)鉤子函數(shù),應(yīng)用了模板方法,查看所有的實(shí)現(xiàn)方法,其中有一個(gè)ServletWebServerApplicationContext,則是當(dāng)前Web容器的實(shí)現(xiàn)。
而ServletWebServerApplicationContext中主要是去獲得ServletWebServerFactory對(duì)象,同時(shí)調(diào)用getWebServer創(chuàng)建WebServer對(duì)象。
此時(shí),主要處理的是Tomcat容器對(duì)象的創(chuàng)建、環(huán)境配置和啟動(dòng)。
四、總結(jié)
到這里,基本就走完了內(nèi)嵌Tomcat創(chuàng)建啟動(dòng)的整個(gè)流程。其實(shí)核心主要還是依賴于SpringBoot的自動(dòng)配置。項(xiàng)目啟動(dòng)的過程中,掃描classpath下的META-INF/spring.factories,實(shí)例化工廠對(duì)象TomcatServletWebServerFactory,在調(diào)用run()方法的時(shí)候完成Tomcat對(duì)象的創(chuàng)建,環(huán)境設(shè)置和啟動(dòng),從而實(shí)現(xiàn)Tomcat容器的自動(dòng)化處理。
到此這篇關(guān)于淺談SpringBoot內(nèi)嵌Tomcat的實(shí)現(xiàn)原理解析的文章就介紹到這了,更多相關(guān)SpringBoot內(nèi)嵌Tomcat內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring整合Mybatis具體代碼實(shí)現(xiàn)流程
這篇文章主要介紹了Spring整合Mybatis實(shí)操分享,文章首先通過介紹Mybatis的工作原理展開Spring整合Mybatis的詳細(xì)內(nèi)容,需要的小伙伴可以參考一下2022-05-05教你一步到位部署運(yùn)行MyBatis3源碼(保姆級(jí))
一個(gè)框架的運(yùn)行流程從最簡(jiǎn)單的一個(gè)helloworld來看其源碼就能了解到框架的原理是什么,這篇文章主要給大家介紹了關(guān)于如何一步到位部署運(yùn)行MyBatis3源碼的相關(guān)資料,需要的朋友可以參考下2022-06-06Springboot 讀取 yml 配置文件里的參數(shù)值
本文主要介紹了Springboot 讀取 yml 配置文件里的參數(shù)值,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12JAVA線程sleep()和wait()詳解及實(shí)例
這篇文章主要介紹了JAVA線程sleep()和wait()詳解及實(shí)例的相關(guān)資料,探討一下sleep()和wait()方法的區(qū)別和實(shí)現(xiàn)機(jī)制,需要的朋友可以參考下2017-05-05Mybatis的mapper標(biāo)簽 namespace屬性用法說明
這篇文章主要介紹了Mybatis的mapper標(biāo)簽 namespace屬性用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09PowerShell用戶認(rèn)證Function實(shí)例代碼
這篇文章主要介紹了PowerShell用戶認(rèn)證Function的資料,并附實(shí)例代碼,幫助大家學(xué)習(xí)理解,有需要的小伙伴可以參考下2016-09-09ssm 使用token校驗(yàn)登錄的實(shí)現(xiàn)
這篇文章主要介紹了ssm 使用token校驗(yàn)登錄的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04