-
版本spring boot 2.1.0.RELEASE
-
spring-boot啓動
spring boot 的啓動時基於加@SpringBootApplication的主類啓動的
-
我們看一下@SpringBootApplication的具體信息
我們看一這個註解的主要的註解
@Target ElementType.TYPE註解的作用目標 類/接口/枚舉/註解
@Retention RetentionPolicy.RUNTIME 會保留到class中,並在JVM加載class文件後仍然存在
@EnableAutoConfiguration 開啓自動配置(spring boot 自動配置的關鍵)
-
@EnableAutoConfiguration
@Import 注入了AutoConfigurationImportSelector,並通過這個類去選擇注入那些組件
@AutoConfigurationPackage 自動配置包
-
AutoConfigurationImportSelector是如何導入組件的呢?
在100行獲取了自動配置項 AutoConfigurationEntry 調用的是getAutoConfigurationEntry方法
我們看一這個方法
返回的數據是new出來的,配置項是第一個構造參數,參數來源於119行的String集合 從getCandidateConfigurations方法獲取
進一步進入loadFactoryNames
進入LoadSpringFactories
133行獲取工廠源 FACTORIES_RESOURCE_LOCATION
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
哦,原來在這裏
這是掃描了spring.factories
136行開始解析讀取到的東西
解釋一下爲什麼使用LinkedMultiValueMap
LinkedMultiValueMap的特性是一個key可以對應多個value
LinkedMultiValueMap.add("key","value1");
LinkedMultiValueMap.add("key","value2");
LinkedMultiValueMap.add("key","value3");
key[value1,value2,value3]
這時我們已經找到我們需要加載的組件了
那我們如何加載呢?
-
我們以DataSourceAutoConfiguration爲例
@Configuration 裝載標識
@ConditionalOnClass 實例化這個bean
@EnableConfigurationProperties 開啓配置文件的屬性裝載讀取項目的application.yml進行裝載
@Import 將依賴的Bean導入當前容器
這樣一個數據源就裝載完畢了,我們就有了DataSource