@SpringBootApplication
这其中有两个比较容易引起我们注意的地方,一个是 @springBoot(onfiguration 注解,另一个是 @nableAutoConfigurati
on 注解;
进入了AutoConfigurationImportselector,class 类,因为谷歌翻译告诉我们,这个是自动配置导入选择器.
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered { @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { if (!isEnabled(annotationMetadata)) { return NO_IMPORTS; } AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader .loadMetadata(this.beanClassLoader); // 获取自动配置的实体 AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry( autoConfigurationMetadata, annotationMetadata); return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations()); } // 具体用来加载自动配置类的方法 protected AutoConfigurationEntry getAutoConfigurationEntry( AutoConfigurationMetadata autoConfigurationMetadata, AnnotationMetadata annotationMetadata) { if (!isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } AnnotationAttributes attributes = getAttributes(annotationMetadata); // 获取候选的配置类,即使后宫佳丽三千,也是要筛选的 List<String> configurations = getCandidateConfigurations(annotationMetadata,attributes); // 根据情况,自动配置需要的配置类和不需要的配置了 configurations = removeDuplicates(configurations); Set<String> exclusions = getExclusions(annotationMetadata, attributes); checkExcludedClasses(configurations, exclusions); configurations.removeAll(exclusions); configurations = filter(configurations, autoConfigurationMetadata); fireAutoConfigurationImportEvents(configurations, exclusions); // 返回最终需要的配置 return new AutoConfigurationEntry(configurations, exclusions); } }
而这个自动配置的实体 AutoConfigurationEntry
里面有两个属性,configurations 和 exclusions 。
在后面可以看到 getAutoConfigurationEntry() 方法返回了一个对象 return new AutoConfigurationEntry(configuration
s,exclusions) 这里也就是把我们需要的配置都拿到了。
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; }
实际上SpringBoot的自动装配原理,其实就是在项目启动的时候去加载META-INF下的 spring,factories 文件,好像也没有那么高大上。当然在启动的过程中还会有其他的配置项的加载,这里咱么直说了自动装配的加载过程。希望对大家可以有所启发。
标签:装配,return,springboot,配置,AutoConfigurationEntry,annotationMetadata,架构师,exclusions From: https://www.cnblogs.com/dongxuanyang/p/17751503.html