Spring Boot 揭祕與實戰 原始碼分析 - 工作原理剖析

樑桂釗發表於2017-01-02

結合《Spring Boot 揭祕與實戰 原始碼分析 - 開箱即用,內藏玄機》一文,我們再來深入的理解 Spring Boot 的工作原理。

部落格地址:blog.720ui.com/

在《Spring Boot 揭祕與實戰 原始碼分析 - 開箱即用,內藏玄機》一文,我們瞭解到 Spring Boot 提供了很多開箱即用的依賴模組,開發者只要在 Maven 的 pom 檔案中新增相關依賴後,Spring Boot 就會針對這個應用自動建立和注入需要的 Spring Bean 到上下文中。

這篇,我們以 FreeMarker 的自動配置為例,重點講解工作原理與載入過程。因為 FreeMarker 相對而言比較簡單,Spring Boot 原始碼中只有三個類,所以作為案例相對而言比較好理解。

Spring Boot 揭祕與實戰 原始碼分析 - 工作原理剖析

EnableAutoConfiguration 幫助我們做了什麼

你還記得 @EnableAutoConfiguration 註解麼?

我們先來回顧下。

@RestController
@EnableAutoConfiguration
@ComponentScan(basePackages = { "com.lianggzone.springboot" })
public class WebMain {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(WebMain.class, args);
    }
}複製程式碼

那麼,現在我們剖析下 @EnableAutoConfiguration 的原始碼。

Spring Boot 揭祕與實戰 原始碼分析 - 工作原理剖析

這裡,關鍵在於 @Import 註解匯入的 EnableAutoConfigurationImportSelector 類中最為關鍵的是 getCandidateConfigurations 方法中通過 SpringFactoriesLoader.loadFactoryNames 掃描 spring.factories 檔案。
Spring Boot 揭祕與實戰 原始碼分析 - 工作原理剖析

現在,我們在來看下 SpringFactoriesLoader 原始碼。
Spring Boot 揭祕與實戰 原始碼分析 - 工作原理剖析

突然,你是不是發現 spring.factories 檔案是相當重要呢?對的,Spring Boot 通過掃描這個檔案中的內容,判斷有哪些自動配置。以 FreeMarker 為例,我們來看下它是如何配置的。
Spring Boot 揭祕與實戰 原始碼分析 - 工作原理剖析

所以,Spring Boot 通過掃描 spring.factories 檔案中的 EnableAutoConfiguration 引數中有哪些自動配置並進行載入。

配置引數類 – FreeMarkerProperties

這裡的配置引數,可以通過application.properties 中直接設定。我們發現,它的字首必須是 spring.freemarker。

Spring Boot 揭祕與實戰 原始碼分析 - 工作原理剖析

自動配置類 – FreeMarkerAutoConfiguration

核心註解

Spring Boot 揭祕與實戰 原始碼分析 - 工作原理剖析

在《Spring Boot 揭祕與實戰 原始碼分析 - 開箱即用,內藏玄機》一文,有提到 @ConditionalOnClass 引數中對應的類在 classpath 目錄下存在時,才會去解析對應的配置類,否則不解析該註解修飾的配置類。

Spring Boot 內部提供了很多自動化配置的類,例如,RedisAutoConfiguration 、MongoRepositoriesAutoConfiguration 、ElasticsearchAutoConfiguration , 這些自動化配置的類會判斷 classpath 中是否存在自己需要的那個類,如果存在則會自動配置相關的配置,否則就不會自動配置,因此,開發者在 Maven 的 pom 檔案中新增相關依賴後,這些依賴就會下載很多 jar 包到 classpath 中,有了這些 lib 就會觸發自動化配置,所以,我們就能很便捷地使用對於的模組功能了。

此外,還有一個主要的註解是 @EnableConfigurationProperties ,主要用來載入我們上面提到的配置引數類。

注入 Bean

Spring Boot 揭祕與實戰 原始碼分析 - 工作原理剖析

這個原始碼非常好理解,我主要想講2個註解。

第一註解是,@ConditionalOnMissingBean(name = "freeMarkerViewResolver"),指定當容器沒有指定Bean的情況下的處理。

第二註解是,@ConditionalOnProperty,指定的屬性是否有指定的值的處理,換句話說,如果在application.properties 沒有配置,預設為 true,即條件符合。

擴充套件閱讀

Spring Boot 揭祕與實戰 自己實現一個簡單的自動配置模組

(完)

更多精彩文章,盡在「服務端思維」微信公眾號!

Spring Boot 揭祕與實戰 原始碼分析 - 工作原理剖析

相關文章