通常springboot程序,咱們都會在主啓動類上加上@SpringBootApplication註解,@SpringBootApplication是一個複合註解,上面標註了@ComponeScan,@EnableAutoConfiguration,默認開啓了包掃碼和自動配置。spring
@EnableAutoConfiguration註解上使用@Import導入了一個類,EnableAutoConfigurationImportSelectorspringboot
EnableAutoConfigurationImportSelector的父類中AutoConfigurationImportSelectorapp
有一個關鍵的方法selectImports(),這個方法會去找classpath下,名爲spring.factories配置文件裏面的須要自動配置的類列表elasticsearch
這裏的factoryClassName就是 org.springframework.boot.autoconfigure.EnableAutoConfiguration ,後面經過classLoader加載spring-boot-autoconfigure.jar META-INF/spring.factories 文件,而後經過spring-boot
factoryClassName找到對應的自動配置類spa
注:(spring.factories文件自動配置類列表仍是很好用的,好比有些時候咱們須要排除某個自動配置,而你又不知道它到底有幾個配置類,能夠參照這裏)3d
有了自動配置類列表還沒完,springboot須要知道列表裏面那些配置是咱們須要的,經過什麼來判斷呢?springboot最主要是經過了@Conditional家族註解,判斷classpath有沒有某個類,容器中有沒有某個bean,application.yml文件中有沒有某一條屬性而且這個屬性爲某個值等等這些條件來判斷,我是否須要裝載這個配置類code
下面以elasticsearch爲例blog
springboot要裝載elasticsearch配置須要知足如下條件:it
看了上面應該知道 ,@Conditional的這些註解是是否啓用自動配置類的關鍵。下圖來自《Spring Boot實戰》一書:
簡單來講,Spring Boot的自動配置分爲如下幾個步驟:
一、@EnableAutoConfiguration註解開啓自動配置,並找到spring-boot-autoconfigure.jar包裏的 META-INF/spring.factories 文件
二、經過factoryClassName找到 META-INF/spring.factories 文件對應的自動配置類列表
三、springboot上下文根據自動配置類裏的 @Conditional 家族註解選擇是否要加載這些配置