最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、序言

使用SpringBoot經(jīng)常會使用內(nèi)嵌的tomcat做為項目的啟動容器,本文將從源碼的角度出發(fā),剖析SpringBoot內(nèi)嵌Tomcat的實現(xiàn)原理,討論Tomcat何時創(chuàng)建、何時啟動以及怎么啟動。

二、引入Tomcat組件

導(dǎo)入依賴:

<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同時會默認(rèn)引入spring-boot-starter-tomcat,即Tomcat啟動的相關(guān)環(huán)境。而對于項目啟動代碼,@SpringBootApplication主要實現(xiàn)Spring組件掃描和自動配置。該注解是復(fù)合注解,其中@EnableAutoConfiguration本身也是一個復(fù)合注解,包含以下內(nèi)容:

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}

這兩個注解比較關(guān)鍵。@AutoConfigurationPackage主要實現(xiàn)自動配置包,會掃描@SpringbootApplication標(biāo)注的類所在包名及其子包,將創(chuàng)建的組件添加到容器中;而@Import則是導(dǎo)入了AutoConfigurationImportSelector.class,實現(xiàn)查找classpath上所有jar包中的META-INF/spring.factories,找出其中的自動配置類并導(dǎo)入到容器中,其中Web容器所對應(yīng)的自動配置類為ServletWebServerFactoryAutoConfiguration。

在這里插入圖片描述

ServletWebServerFactoryAutoConfiguration中支持好幾種web容器,比如Tomcat、Jetty和Undertow。

在這里插入圖片描述

而EmbeddedTomcat則是Tomcat組件相關(guān)的類,本身是一個FactoryBean,用來實例化TomcatServletWebServerFactory。此時TomcatServletWebServerFactory中就包含了創(chuàng)建和啟動Tomcat的方法getWebServer()。

在這里插入圖片描述

三、Tomcat組件啟動

SpringBoot是在項目啟動的時候才同時啟動Tomcat的,很顯然getWebServer()是在項目啟動的過程中調(diào)用的。跟蹤SpringApplication的run(),其中存在refreshContext(context),此時主要完成容器的刷新。

在這里插入圖片描述

容器刷新跟蹤到最后是AbstractApplicationContext中的onRefresh(),顯然這是一個鉤子函數(shù),應(yīng)用了模板方法,查看所有的實現(xiàn)方法,其中有一個ServletWebServerApplicationContext,則是當(dāng)前Web容器的實現(xiàn)。

在這里插入圖片描述

而ServletWebServerApplicationContext中主要是去獲得ServletWebServerFactory對象,同時調(diào)用getWebServer創(chuàng)建WebServer對象。

在這里插入圖片描述

此時,主要處理的是Tomcat容器對象的創(chuàng)建、環(huán)境配置和啟動。

在這里插入圖片描述

在這里插入圖片描述

四、總結(jié)

到這里,基本就走完了內(nèi)嵌Tomcat創(chuàng)建啟動的整個流程。其實核心主要還是依賴于SpringBoot的自動配置。項目啟動的過程中,掃描classpath下的META-INF/spring.factories,實例化工廠對象TomcatServletWebServerFactory,在調(diào)用run()方法的時候完成Tomcat對象的創(chuàng)建,環(huán)境設(shè)置和啟動,從而實現(xiàn)Tomcat容器的自動化處理。

到此這篇關(guān)于淺談SpringBoot內(nèi)嵌Tomcat的實現(xiàn)原理解析的文章就介紹到這了,更多相關(guān)SpringBoot內(nèi)嵌Tomcat內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 自己手寫Mybatis通用batchInsert問題

    自己手寫Mybatis通用batchInsert問題

    這篇文章主要介紹了自己手寫Mybatis通用batchInsert問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • SpringBoot集成MinIO的示例代碼

    SpringBoot集成MinIO的示例代碼

    對象存儲服務(wù)OSS是一種海量、安全、低成本、高可靠的云存儲服務(wù),適合存放任意類型的文件,這篇文章主要介紹了SpringBoot集成MinIO的示例代碼,需要的朋友可以參考下
    2023-06-06
  • httpclient evict操作源碼解讀

    httpclient evict操作源碼解讀

    這篇文章主要為大家介紹了httpclient evict操作源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Java調(diào)用明華RF讀寫器DLL文件過程解析

    Java調(diào)用明華RF讀寫器DLL文件過程解析

    這篇文章主要介紹了Java調(diào)用明華RF讀寫器DLL文件過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • 詳解Java序列化如何破壞單例模式

    詳解Java序列化如何破壞單例模式

    這篇文章主要為大家詳細(xì)介紹了Java序列化是如何破壞單例模式的,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-12-12
  • springboot2.2 集成 activity6實現(xiàn)請假流程(示例詳解)

    springboot2.2 集成 activity6實現(xiàn)請假流程(示例詳解)

    這篇文章主要介紹了springboot2.2 集成 activity6實現(xiàn)請假完整流程示例詳解,本文通過示例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 實例講解Java 自旋鎖

    實例講解Java 自旋鎖

    這篇文章主要介紹了Java 自旋鎖的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java并發(fā),感興趣的朋友可以了解下
    2020-09-09
  • 使用Java8?Stream流的skip?+?limit實現(xiàn)批處理的方法

    使用Java8?Stream流的skip?+?limit實現(xiàn)批處理的方法

    Stream 作為 Java 8 的一大亮點,它與 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念這篇文章主要介紹了使用Java8?Stream流的skip?+?limit實現(xiàn)批處理,需要的朋友可以參考下
    2022-07-07
  • 手寫redis@Cacheable注解?支持過期時間設(shè)置方式

    手寫redis@Cacheable注解?支持過期時間設(shè)置方式

    這篇文章主要介紹了手寫redis@Cacheable注解?支持過期時間設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 通過字節(jié)碼看java中this的隱式傳參詳解

    通過字節(jié)碼看java中this的隱式傳參詳解

    這篇文章主要給大家介紹了關(guān)于如何通過字節(jié)碼看java中this的隱式傳參的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11

最新評論

巨野县| 凌云县| 镇原县| 宁化县| 峡江县| 凉山| 广南县| 连江县| 乌恰县| 西华县| 克山县| 神农架林区| 绥宁县| 达尔| 绥中县| 长春市| 宜兴市| 图们市| 宁陕县| 衡山县| 荣成市| 佛教| 辽中县| 镇安县| 清镇市| 兰溪市| 丰县| 黄山市| 梨树县| 昌吉市| 潼南县| 外汇| 恩平市| 达孜县| 彭泽县| 任丘市| 金坛市| 南乐县| 临海市| 孟津县| 区。|