SpringBoot啟動(dòng)tomcat源碼解讀

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

一、SpringBoot自動(dòng)拉起Tomcat

? ? ? ? SpringBoot框架是當(dāng)前比較流行的java后端開發(fā)框架,與maven結(jié)合大大簡化了開發(fā)人員項(xiàng)目搭建的步驟,我們知道SpringBoot的啟動(dòng)類啟動(dòng)后,tomcat容器、SpringMVC、spring事務(wù)等第三方依賴也已經(jīng)自動(dòng)啟動(dòng)。那么SpringBoot是如何啟動(dòng)這些第三方依賴的呢?下面以SpringBoot拉起tomcat容器為例,進(jìn)行源碼分析。

更多深度技術(shù)文章,在這里。?java開發(fā)工具下載地址及安裝教程大全,點(diǎn)這里

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

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

圖(1)
圖(2)

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

圖(3)

3、圖(3)中使用@Import注解對AutoConfigurationImportSelector 類進(jìn)行了引入,該類做了什么事情呢?進(jìn)入源碼,首先調(diào)用selectImport()方法,在該方法中調(diào)用了getAutoConfigurationEntry()方法,在之中又調(diào)用了getCandidateConfigurations()方法,getCandidateConfigurations()方法就去META-INF/spring.factory配置文件中加載相關(guān)配置類

圖(4)

這個(gè)spring.factories配置文件是加載的spring-boot-autoconfigure的配置文件,由此可以推測如果自定義starter插件的話,spring也是采用這種方式去加載的。此處不細(xì)講自定義starter。

圖(5)

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

圖(6)

進(jìn)入該類,里面也通過@Import注解將EmbeddedTomcat、EmbeddedJetty、EmbeddedUndertow等嵌入式容器類加載進(jìn)來了,springboot默認(rèn)是啟動(dòng)嵌入式tomcat容器,如果要改變啟動(dòng)jetty或者undertow容器,需在pom文件中去設(shè)置。如圖(7)

圖(7)

繼續(xù)進(jìn)入EmbeddedTomcat類中,見圖(8):

圖(8)

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

圖(9)

繼續(xù)進(jìn)入getTomcatWebServer()等方法,一直往下跟到tomcat初始化方法,調(diào)用tomcat.start()方法,tomcat就正式開啟運(yùn)行,見圖(10)

圖(10)

走到這里tomcat在springboot中的配置以及最終啟動(dòng)的流程就走完了,相信大家肯定有一個(gè)疑問,圖(9)中的getWebServer()方法是在哪里調(diào)用的呢?上面的代碼流程并沒有發(fā)現(xiàn)getWebServer()被調(diào)用的地方。因?yàn)間etWebServer()方法的調(diào)用根本就不在上面的代碼流程中,它是在另外一個(gè)流程中被調(diào)用的。

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

首先進(jìn)入SpringBoot啟動(dòng)類的run方法:

圖(11)
圖(12)

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

圖(13)

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

圖(14)
圖(15)
圖(16)
圖(17)

繼續(xù)進(jìn)入getWebServer()方法,如圖(18):

圖(18)
圖(19)

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

總結(jié):通過闡述一個(gè)嵌入式tomcat在SpringBoot中的啟動(dòng)流程,其他諸如SpringMVC等也是使用這種方式隨著SpringBoot的啟動(dòng)而啟動(dòng)的。SpringBoot是Spring的輕量級實(shí)現(xiàn),不難發(fā)現(xiàn),getWebServer()方法的啟動(dòng)是Spring源碼實(shí)現(xiàn)。因此,也推薦多了解了解Spring的源碼。

原創(chuàng)文章,轉(zhuǎn)載請注明出處。

更多深度技術(shù)文章,在這里。?java開發(fā)工具下載地址及安裝教程大全,點(diǎn)這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容