看完,SpringBoot自動配置你就懂了!

SpringBoot 是個很強大的框架,免去很多繁雜配置,它是怎麼實現這些功能的,來看看 SpringBoot 的運行原理。

首先,SpringBoot 啓動類是整個項目的啓動入口,@SpringBootApplication 註解是整個啓動類的核心,可以看一下 @SpringBootApplication 的部分源碼。

可以看出 @SpringBootApplication 註解是一個組合註解,主要由 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan 等註解組成。但是自動配置的核心功能主要是通過 @EnableAutoConfiguration 註解完成的,可以看一下 @EnableAutoConfiguration 源碼。

在 @EnableAutoConfiguration 註解中,關鍵功能是通過 @Import 註解導入的配置功能,查看 AutoConfigurationImportSelector 類源碼。

在這個類中通過 getCandidateConfigurations() 方法掃描 META-INF/spring.factories 文件的 jar 包。

看到這裏,我們可以通過 Maven 依賴查看一下 spring-boot-autoconfigure-2.1.7.RELEASE.jar 中 META-INF/spring.factories 文件。

spring-boot-autoconfigure-2.1.7.RELEASE.jar 這個 jar 包就是 SpringBoot 主要依賴的自動配置的 jar 包。

從這個文件中可以看出 SpringBoot 聲明瞭哪些自動配置,

通過 spring.factories 上包路徑,可以隨便點幾個進去查看一下源碼,發現上面任意一個 AutoConfiguration 文件中,一般都有用到下面的條件註解,這些條件註解在 spring-boot-autoconfigure-2.1.7.RELEASE.jar 中 Condition 包下。

  1. @ConditionOnBean:當容器中有指定的 Bean 的條件下。
  2. @ConditionOnClass:當類路徑下有指定的類的條件下。
  3. @ConditionOnExpression:基於 SpEl 表達式作爲判斷條件。
  4. @ConditionOnJava:基於 JVM 版本作爲判斷條件。
  5. @ConditionOnJndi:在 JNDI 存在的條件下查找指定的位置。
  6. @ConditionOnMissingBean:當容器中沒有指定 Bean 的情況下。
  7. @ConditionOnMissingClass:當類路徑下沒有指定的類的條件下。
  8. @ConditionOnNotWebApplication:當前項目不是 Web 項目的條件下。
  9. @ConditionOnProperty:指定的屬性是否有指定的值。
  10. @ConditionOnResource:類路徑是否有指定的值。
  11. @ConditionOnSingleCandidate:當指定 Bean 在容器中只有一個,或者雖然有多個但是指定首選的 Bean。
  12. @ConditionOnWebApplication:當前項目是 Web 項目的情況下。

由於我一般是使用 SpringBoot 創建 Web 項目,所以我們拿 @ConditionOnWebApplication 研究一下,下面是 @ConditionOnWebApplication 部分源碼。

這裏可以看出,@ConditionOnWebApplication 使用 @Conditional 註解,判斷條件是 OnWebApplicationCondition,接着看一下 OnWebApplicationCondition 類是怎麼構造的。


OnWebApplicationCondition 繼承了 SpringBootCondition,該類中最爲主要的是 getMatchOutcome() 和 isWebApplication() 兩個方法,在我看來,在項目啓動時,會調用 getMatchOutcome 匹配當前是否是 Web 項目來加載配置。

大致的 SpringBoot 啓動流程就是這樣,有不同理解的可以討論一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章