實(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