SpringBoot是一个约定大于配置的典范,在启动SpringBoot时,只有一个注解SpringBootApplication
点进去这个注解,里面有三个比较重要的注解
1.其中SpringBootConfiguration的底层是Configuration注解,说明SpringBoot使用配置类来代替XML文件。
2.ComponentScan将Controller,Service,Component和Repository等组件添加到IOC容器中。
3.和自动配置相关的配置注解是:EnableAutoConfiguration,点进去看,可以发现:另外两个重要的注解:@AutoConfigurationPackage
@Import
a.第一个是自动配置包,导入了一个AutoConfigurationPackages.Registrar的类
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage
看一下这个Registrar类的方法:这个方法是用来扫描@Entiry的,而其他例如@Controller由@ComponentScan扫描
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
}
b.然后是Import(AutoConfigurationImportSelector.class)
重点关注:AutoConfigurationImportSelector里头的selectImports方法:
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
里面有一个**getAutoConfigurationEntry()**函数,点进去里面有一个getCandidateConfigurations()方法
getCandidateConfigurations方法调用SpringFactoriesLoader的.loadFactoryNames方法:
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
从META-INFO/spring.factories中扫描,包装成Properties对象。然后使用EnableAutoConfiguration.class去加载,一共识113个默认的配置加载类,然后在经过过滤,@Condition注解和exclude去过滤