在主程序中,使用了@SpringBootApplication
註解,它其實使用了@EnableAutoConfiguration
註解來完成一系列操作,@EnableAutoConfiguration
註解import了AutoConfigurationImportSelector
類,
它的構造函數實現了DeferredImportSelector
接口,
上一節,我們學習過Spring Boot2.0版本源碼(八):Spring Boot的註解的解析出Bean之核心方法,裏面的ConfigurationClassParser
類解析註解的核心方法中有一個processImports()
方法(該方法是在解析配置文件時調用),專門用於處理@Import
註解的一個方法,處理DeferredImportSelector
接口的在如下代碼中實現。
handle方法會將當前的DeferredImportSelector
的實現類加入到deferredImportSelectors
這個需要處理的handler之中。
在解析完成以後,處理之前注入的deferredImportSelectorHandler
類中的集合
process()
源碼如下:
下面的會使用getImports()
方法,在getImports()
方法內部會調用process()
方法
繼續跟進,在getAutoConfigurationEntry()
方法內執行解析@EnableAutoConfiguration
註解的過程中,會注入一個org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
類。
進入這個類,發現會將EmbeddedTomcat.class
這個類注入進來。
最後由EmbeddedTomcat
這個類引入了TomcatServletWebServerFactory
這個工廠類。
當這個工廠被注入以後,我們上一章Spring Boot2.0版本源碼(九):Spring Boot的Servlet容器啓動解析整體流程中講過ServletWebServerApplicationContext
類中的refresh()
方法創建一個web容器,裏面會用到tomcat工廠去去實現web容器的創建。