咱們瞭解到 Spring Boot 提供了不少開箱即用的依賴模塊,開發者只要在 Maven 的 pom 文件中添加相關依賴後,Spring Boot 就會針對這個應用自動建立和注入須要的 Spring Bean 到上下文中。spring
這篇,咱們以 FreeMarker 的自動配置爲例,重點講解工做原理與加載過程。由於 FreeMarker 相對而言比較簡單,Spring Boot 源碼中只有三個類,因此做爲案例相對而言比較好理解。springboot
EnableAutoConfiguration 幫助咱們作了什麼
你還記得 @EnableAutoConfiguration 註解麼?app
咱們先來回顧下。ide
@RestController @EnableAutoConfiguration @ComponentScan(basePackages = { "com.lianggzone.springboot" }) public class WebMain { public static void main(String[] args) throws Exception { SpringApplication.run(WebMain.class, args); } }
那麼,如今咱們剖析下 @EnableAutoConfiguration 的源碼。
源碼分析
這裏,關鍵在於 @Import 註解導入的 EnableAutoConfigurationImportSelector 類中最爲關鍵的是 getCandidateConfigurations 方法中經過 SpringFactoriesLoader.loadFactoryNames 掃描 spring.factories 文件。
spa
如今,咱們在來看下 SpringFactoriesLoader 源碼。
3d
忽然,你是否是發現 spring.factories 文件是至關重要呢?對的,Spring Boot 經過掃描這個文件中的內容,判斷有哪些自動配置。以 FreeMarker 爲例,咱們來看下它是如何配置的。
code
因此,Spring Boot 經過掃描 spring.factories 文件中的 EnableAutoConfiguration 參數中有哪些自動配置並進行加載。blog
配置參數類 – FreeMarkerProperties
這裏的配置參數,能夠經過application.properties 中直接設置。咱們發現,它的前綴必須是 spring.freemarker。
開發
自動配置類 – FreeMarkerAutoConfiguration
核心註解
在《 Spring Boot 揭祕與實戰 源碼分析 - 開箱即用,內藏玄機 》一文,有提到 @ConditionalOnClass 參數中對應的類在 classpath 目錄下存在時,纔會去解析對應的配置類,不然不解析該註解修飾的配置類。
Spring Boot 內部提供了不少自動化配置的類,例如,RedisAutoConfiguration 、MongoRepositoriesAutoConfiguration 、ElasticsearchAutoConfiguration , 這些自動化配置的類會判斷 classpath 中是否存在本身須要的那個類,若是存在則會自動配置相關的配置,不然就不會自動配置,所以,開發者在 Maven 的 pom 文件中添加相關依賴後,這些依賴就會下載不少 jar 包到 classpath 中,有了這些 lib 就會觸發自動化配置,因此,咱們就能很便捷地使用對於的模塊功能了。
此外,還有一個主要的註解是 @EnableConfigurationProperties ,主要用來加載咱們上面提到的配置參數類。
注入 Bean
這個源碼很是好理解,我主要想講2個註解。
第一註解是,@ConditionalOnMissingBean(name = 「freeMarkerViewResolver」),指定當容器沒有指定Bean的狀況下的處理。
第二註解是,@ConditionalOnProperty,指定的屬性是否有指定的值的處理,換句話說,若是在application.properties 沒有配置,默認爲 true,即條件符合。