Spring Boot 自動(dòng)裝配原理

實(shí)例化并且調(diào)用是在 AbstractApplicationContext 中進(jìn)行的,最終會(huì)在 ConfigurationClassPostProcessor#processConfigBeanDefinitions 調(diào)用 ConfigurationClassParser#parse 的方法,最后會(huì)調(diào)用 doProcessConfigurationClass 對(duì)其各種注解進(jìn)行解析,在處理 @Import 注解的時(shí)候會(huì)將 @Import 導(dǎo)入的類通過 getImports(sourceClass) 方法直接獲得,可以看到 importCandidates 中有四個(gè)值,主要的兩個(gè)為 AutoConfigurationPackages$Register 和 AutoConfigurationImportSelector,

通過類圖可以看到 AutoConfigurationImportSelector 實(shí)現(xiàn)了 DeferredImportSelector 接口,所以在 processImports 中處理的時(shí)候,會(huì)使用 DeferredImportSelectorHandler#handle 進(jìn)行處理,將其添加到 deferredImportSelectors 列表中,

解析完成之后,在 ConfigurationClassParser#parse 方法中 this.deferredImportSelectorHandler.process() 進(jìn)行處理導(dǎo)入的 AutoConfigurationImportSelector類。使用 DeferredImportSelectorGroupingHandler#processGroupImports() 進(jìn)行下一步的處理。

grouping.getImports() -> getImports() -> process()。

在 process 方法中會(huì)獲取所有自動(dòng)裝配的 class 對(duì)象,調(diào)用的是 AutoConfigurationImportSelector#getAutoConfigurationEntry 的方法,通過getCandidateConfigurations(annotationMetadata, attributes) 獲取所有的候選配置類,在其中調(diào)用 SpringFactoriesLoader#LoadFactoryNames 方法獲取。

AutoConfigurationEntry autoConfigurationEntry = ((AutoConfigurationImportSelector)deferredImportSelector).getAutoConfigurationEntry(annotationMetadata);

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {

? ? List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),

getBeanClassLoader());

? ? Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you " + "are using a custom packaging, make sure that file is correct.");

? ? return configurations;

}

public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {

? ? ClassLoader classLoaderToUse = classLoader;

? ? if (classLoaderToUse == null) {

? ? ? ? classLoaderToUse = SpringFactoriesLoader.class.getClassLoader();

? ? }

? ? String factoryTypeName = factoryType.getName();

? ? return loadSpringFactories(classLoaderToUse).getOrDefault(factoryTypeName, Collections.emptyList());

}

/** 返回SpringFactoriesLoader用來加載候選配置的類 */

protected Class<?> getSpringFactoriesLoaderFactoryClass() {

? ? return EnableAutoConfiguration.class;

}

最終通過 loadSpringFactories 獲取在 META-INF/spring.factories 中所有的配置。

USB Microphone https://www.soft-voice.com/

Wooden Speakers? https://www.zeshuiplatform.com/

亞馬遜測評(píng) www.yisuping.cn

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容