通过文章6,7,8大概就能知道Spring Boot的自动配置原理和Spring Boot重要核心-自动配置,
我们在pom中引入依赖,会自动注册一些类和方法到项目中,依据引入spring-boot-starter-web依赖,
启动类注解:
@SpringBootApplication
按CTRL—鼠标左键,进入注解类
@SpringBootConfiguration
@EnableAutoConfiguration
@SpringBootConfiguration包含:证明启动类也是一个配置类
@Configuration
@EnableAutoConfiguration包含:文章7中,我们用到过 ImportSelector 类,这个类会被Spring Boot 自动调用
@Import({AutoConfigurationImportSelector.class})
继续进入AutoConfigurationImportSelector 类中,实现 DeferredImportSelector 类
实现方法
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return NO_IMPORTS;
} else {
AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
}
返回的结果集是:autoConfigurationEntry.getConfigurations()
结果集是从:this.getAutoConfigurationEntry(annotationMetadata)这个方法来,进入方法
protected AutoConfigurationEntry getAutoConfigurationEntry(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 = getConfigurationClassFilter().filter(configurations);
fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationEntry(configurations, exclusions);
}
而返回的类里,configurations是通过getCandidateConfigurations(annotationMetadata, attributes)方法,再继续进入方法
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
ImportCandidates importCandidates = ImportCandidates.load(this.autoConfigurationAnnotation,
getBeanClassLoader());
List<String> configurations = importCandidates.getCandidates();
Assert.notEmpty(configurations,
"No auto configuration classes found in " + "META-INF/spring/"
+ this.autoConfigurationAnnotation.getName() + ".imports. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
}
这个类就已经能看到,和我们在第七章中的配置文件加载类方法相同了,打断点测试,能看到this.autoConfigurationAnnotation,这个路径值
在右侧找到对应的包,能看到加载的内容,和配置文件的内容相同,自此,SpringBoot的自动配置原理已经搞清楚了,
希望能自己手动找一遍,印象会更深刻