淺談SpringBoot內嵌Tomcat的實現原理解析
一、序言
使用SpringBoot經常會使用內嵌的tomcat做為項目的啟動容器,本文將從源碼的角度出發,剖析SpringBoot內嵌Tomcat的實現原理,討論Tomcat何時創建、何時啟動以及怎麼啟動。
二、引入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啟動的相關環境。而對於項目啟動代碼,@SpringBootApplication
主要實現Spring組件掃描和自動配置。該註解是復合註解,其中@EnableAutoConfiguration
本身也是一個復合註解,包含以下內容:
@AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { }
這兩個註解比較關鍵。@AutoConfigurationPackage
主要實現自動配置包,會掃描@SpringbootApplication
標註的類所在包名及其子包,將創建的組件添加到容器中;而@Import
則是導入瞭AutoConfigurationImportSelector.class,實現查找classpath上所有jar包中的META-INF/spring.factories,找出其中的自動配置類並導入到容器中,其中Web容器所對應的自動配置類為ServletWebServerFactoryAutoConfiguration。
ServletWebServerFactoryAutoConfiguration中支持好幾種web容器,比如Tomcat、Jetty和Undertow。
而EmbeddedTomcat則是Tomcat組件相關的類,本身是一個FactoryBean,用來實例化TomcatServletWebServerFactory。此時TomcatServletWebServerFactory中就包含瞭創建和啟動Tomcat的方法getWebServer()。
三、Tomcat組件啟動
SpringBoot是在項目啟動的時候才同時啟動Tomcat的,很顯然getWebServer()是在項目啟動的過程中調用的。跟蹤SpringApplication的run(),其中存在refreshContext(context),此時主要完成容器的刷新。
容器刷新跟蹤到最後是AbstractApplicationContext中的onRefresh(),顯然這是一個鉤子函數,應用瞭模板方法,查看所有的實現方法,其中有一個ServletWebServerApplicationContext,則是當前Web容器的實現。
而ServletWebServerApplicationContext中主要是去獲得ServletWebServerFactory對象,同時調用getWebServer創建WebServer對象。
此時,主要處理的是Tomcat容器對象的創建、環境配置和啟動。
四、總結
到這裡,基本就走完瞭內嵌Tomcat創建啟動的整個流程。其實核心主要還是依賴於SpringBoot的自動配置。項目啟動的過程中,掃描classpath下的META-INF/spring.factories,實例化工廠對象TomcatServletWebServerFactory,在調用run()方法的時候完成Tomcat對象的創建,環境設置和啟動,從而實現Tomcat容器的自動化處理。
到此這篇關於淺談SpringBoot內嵌Tomcat的實現原理解析的文章就介紹到這瞭,更多相關SpringBoot內嵌Tomcat內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- SpringBoot自動配置特點與原理詳細分析
- SpringBoot自動配置原理,你真的懂嗎?(簡單易懂)
- SpringBoot自動配置與啟動流程詳細分析
- Springboot-yaml配置和自動配置原理分析
- 詳解SpringBoot自動配置源碼