淺談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!

推薦閱讀: