SpringBoot的自动配置原理之一
我自己认为springboot自动配置最重要的是run()方法和@springbootapplication注解
大致流程图

@springbootapplication注解

第一个@ComponentScan就是扫描当前主体类同级的包
这也是springboot建立包必须同级的原因,必经框架是约定大于配置
第二个@SpringBootConfiguration表示这是一个spring boot的配置


他的里面就是一个@Configuration 表示他是一个spring配置 再往里面就是一个@Component表示是他是一个组件 。总之springboot是在spring基础上肯定还是有spring的组件
第三个@EnableAutoConfiguration里面有两个重要的注解
1@AutoConfigurationPackage
2@Import({AutoConfigurationImportSelector.class})
先看第一个@AutoConfigurationPackage自动导入配置包
里面有一个@Import({Registrar.class})叫做自动配置包注册,Registrar.class里面有一个方法叫registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) 导入metadata源数据
第二个@Import({AutoConfigurationImportSelector.class})里面的AutoConfigurationImportSelector.class叫做自动配置导入选择
这个类下面的selectImports(AnnotationMetadata annotationMetadata)选择要加载的组件
getAutoConfigurationEntry()方法
protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
} else {
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
configurations = this.removeDuplicates(configurations);
Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
this.checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = this.getConfigurationClassFilter().filter(configurations);
this.fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
}
List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
getCandidateConfigurations这个方法中有
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.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;
}
其中 loadFactoryNames获取获取所有的包名,类名,通过一个 Enumeration urls = classLoader.getResources(“META-INF/spring.factories”);去获取META-INF/spring.factories里面所有的配置用一个while()循环遍历,将遍历到的 Properties properties = PropertiesLoaderUtils.loadProperties(resource);加载到properties 里面。
Assert.notEmpty保证configurations不为空且去META-INF/spring.factores里面找配置。

3506

被折叠的 条评论
为什么被折叠?



