SpringBoot啟動tomcat源碼解讀


原文鏈接:http://www.studyshare.cn/blog/details/1136/1

一、SpringBoot自動拉起Tomcat

        SpringBoot框架是當前比較流行的java后端開發框架,與maven結合大大簡化了開發人員項目搭建的步驟,我們知道

SpringBoot的啟動類啟動后,tomcat容器、SpringMVC、spring事務等第三方依賴也已經自動啟動。那么SpringBoot是如何啟動這

些第三方依賴的呢?下面以SpringBoot拉起tomcat容器為例,進行源碼分析。

java開發工具下載地址及安裝教程大全,點這里
更多技術文章,在這里

二、源碼解析之配置文件加載嵌入式Tomcat

1、進入SpringBoot啟動類,@SpringBootApplication是SpringBoot掃描第三方依賴的重要注解,進入查看該注解的源碼,如圖(2)


圖(1)

圖(2)

2、圖(2)中的重點注解是@EnableAutoConfiguration,進入該注解,如圖(3)


圖(3)

3、圖(3)中使用@Import注解對AutoConfigurationImportSelector 類進行了引入,該類做了什么事情呢?進入源碼,首先調用

selectImport()方法,在該方法中調用了getAutoConfigurationEntry()方法,在之中又調用了getCandidateConfigurations()方法,

getCandidateConfigurations()方法就去META-INF/spring.factory配置文件中加載相關配置類


圖(4)

這個spring.factories配置文件是加載的spring-boot-autoconfigure的配置文件,由此可以推測如果自定義starter插件的話,spring也

是采用這種方式去加載的。此處不細講自定義starter。


圖(5)

繼續打開spring.factories配置文件,找到tomcat所在的類,tomcat加載在ServletWebServerFactoryAutoConfiguration配置類中,


圖(6)

進入該類,里面也通過@Import注解將EmbeddedTomcat、EmbeddedJetty、EmbeddedUndertow等嵌入式容器類加載進來了,

springboot默認是啟動嵌入式tomcat容器,如果要改變啟動jetty或者undertow容器,需在pom文件中去設置。如圖(7)


圖(7)

繼續進入EmbeddedTomcat類中,見圖(8):


圖(8)

進入TomcatServletWebServerFactory類,里面的getWebServer()是關鍵方法,如圖(9):


圖(9)

繼續進入getTomcatWebServer()等方法,一直往下跟到tomcat初始化方法,調用tomcat.start()方法,tomcat就正式開啟運行,見圖(10)


圖(10)

走到這里tomcat在springboot中的配置以及最終啟動的流程就走完了,相信大家肯定有一個疑問,圖(9)中的getWebServer()

方法是在哪里調用的呢?上面的代碼流程並沒有發現getWebServer()被調用的地方。因為getWebServer()方法的調用根本就不在

上面的代碼流程中,它是在另外一個流程中被調用的。

三、源碼解析之SpringBoot調用getWebServer()

首先進入SpringBoot啟動類的run方法:


圖(11)

圖(12)

進入refreshContext()方法,如圖(13):


圖(13)

一直點擊refresh()方法,如圖(14):


圖(14)

圖(15)

圖(16)

圖(17)

繼續進入getWebServer()方法,如圖(18):


圖(18)

圖(19)

最終就調用了TomcatServletWebServerFactory類的getWebServer()方法。

總結:通過闡述一個嵌入式tomcat在SpringBoot中的啟動流程,其他諸如SpringMVC等也是使用這種方式隨着SpringBoot的啟動而

啟動的。SpringBoot是Spring的輕量級實現,不難發現,getWebServer()方法的啟動是Spring源碼實現。因此,也推薦多了解了解Spring的源碼。

java開發工具下載地址及安裝教程大全,點這里
更多技術文章,在這里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM