原文鏈接: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)


2、圖(2)中的重點(diǎn)注解是@EnableAutoConfiguration,進(jìn)入該注解,如圖(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)配置類

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

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

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

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

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

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


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

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




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


最終就調(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)載請注明出處。