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


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

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

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

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

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

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

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

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

走到這里tomcat在springboot中的配置以及最終啟動的流程就走完了,相信大家肯定有一個疑問,圖(9)中的getWebServer()
方法是在哪里調用的呢?上面的代碼流程並沒有發現getWebServer()被調用的地方。因為getWebServer()方法的調用根本就不在
上面的代碼流程中,它是在另外一個流程中被調用的。
三、源碼解析之SpringBoot調用getWebServer()
首先進入SpringBoot啟動類的run方法:


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

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




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


最終就調用了TomcatServletWebServerFactory類的getWebServer()方法。
總結:通過闡述一個嵌入式tomcat在SpringBoot中的啟動流程,其他諸如SpringMVC等也是使用這種方式隨着SpringBoot的啟動而
啟動的。SpringBoot是Spring的輕量級實現,不難發現,getWebServer()方法的啟動是Spring源碼實現。因此,也推薦多了解了解Spring的源碼。