欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談SpringBoot內(nèi)嵌Tomcat的實(shí)現(xiàn)原理解析

 更新時(shí)間:2020年12月20日 16:57:59   作者:無聊的洪某人  
這篇文章主要介紹了淺談SpringBoot內(nèi)嵌Tomcat的實(shí)現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、序言

使用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)文章

  • 實(shí)例分析java對(duì)象的序列化和反序列化

    實(shí)例分析java對(duì)象的序列化和反序列化

    序列化 (Serialization)是將對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问降倪^程。一般將一個(gè)對(duì)象存儲(chǔ)至一個(gè)儲(chǔ)存媒介,例如檔案或是記億體緩沖等。在網(wǎng)絡(luò)傳輸過程中,可以是字節(jié)或是XML等格式。而字節(jié)的或XML編碼格式可以還原完全相等的對(duì)象。這個(gè)相反的過程又稱為反序列化
    2018-09-09
  • Mybatis如何一次性插入多條數(shù)據(jù)

    Mybatis如何一次性插入多條數(shù)據(jù)

    這篇文章主要介紹了Mybatis如何一次性插入多條數(shù)據(jù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Spring整合Mybatis具體代碼實(shí)現(xiàn)流程

    Spring整合Mybatis具體代碼實(shí)現(xiàn)流程

    這篇文章主要介紹了Spring整合Mybatis實(shí)操分享,文章首先通過介紹Mybatis的工作原理展開Spring整合Mybatis的詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-05-05
  • 教你一步到位部署運(yùn)行MyBatis3源碼(保姆級(jí))

    教你一步到位部署運(yùn)行MyBatis3源碼(保姆級(jí))

    一個(gè)框架的運(yùn)行流程從最簡(jiǎn)單的一個(gè)helloworld來看其源碼就能了解到框架的原理是什么,這篇文章主要給大家介紹了關(guān)于如何一步到位部署運(yùn)行MyBatis3源碼的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Springboot 讀取 yml 配置文件里的參數(shù)值

    Springboot 讀取 yml 配置文件里的參數(shù)值

    本文主要介紹了Springboot 讀取 yml 配置文件里的參數(shù)值,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • JAVA線程sleep()和wait()詳解及實(shí)例

    JAVA線程sleep()和wait()詳解及實(shí)例

    這篇文章主要介紹了JAVA線程sleep()和wait()詳解及實(shí)例的相關(guān)資料,探討一下sleep()和wait()方法的區(qū)別和實(shí)現(xiàn)機(jī)制,需要的朋友可以參考下
    2017-05-05
  • Mybatis的mapper標(biāo)簽 namespace屬性用法說明

    Mybatis的mapper標(biāo)簽 namespace屬性用法說明

    這篇文章主要介紹了Mybatis的mapper標(biāo)簽 namespace屬性用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring Boot整合swagger使用教程詳解

    Spring Boot整合swagger使用教程詳解

    這篇文章主要介紹了Spring Boot整合swagger使用教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • PowerShell用戶認(rèn)證Function實(shí)例代碼

    PowerShell用戶認(rèn)證Function實(shí)例代碼

    這篇文章主要介紹了PowerShell用戶認(rèn)證Function的資料,并附實(shí)例代碼,幫助大家學(xué)習(xí)理解,有需要的小伙伴可以參考下
    2016-09-09
  • ssm 使用token校驗(yàn)登錄的實(shí)現(xiàn)

    ssm 使用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

最新評(píng)論