第九章 SpringBoot 自动配置原理 入门
1. 引导加载自动配置类
@SpringBootApplication
-- @SpringBootConfiguration
-- @EnableAutoConfiguration
-- @ComponentScan
//@SpringBootApplication@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication{}
1.1 @SpringBootConfiguration
@Configuration。代表当前是一个配置类
1.2 @ComponentScan
指定扫描哪些,Spring注解;
1.3 @EnableAutoConfiguration
@EnableAutoConfiguration
-- @AutoConfigurationPackage
-- @Import(AutoConfigurationImportSelector.class)
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
1.3.1 @AutoConfigurationPackage
@AutoConfigurationPackage
-- @Import(AutoConfigurationPackages.Registrar.class)
自动配置包 , 指定了默认的包规则(扫描启动类包下的组件)
@Import(AutoConfigurationPackages.Registrar.class) //给容器中导入一个组件
public @interface AutoConfigurationPackage {}//利用Registrar给容器中导入一系列组件
//将指定的一个包下的所有组件导入进来?MainApplication 所在包下。static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {@Overridepublic void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {// 1、当前启动类目录下的组件注册register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));}
}//2、构造器再默认加载basePackages和basePackageClasses下面的组件注册
PackageImports(AnnotationMetadata metadata) {AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(AutoConfigurationPackage.class.getName(), false));List<String> packageNames = new ArrayList<>();// 获取for (String basePackage : attributes.getStringArray("basePackages")) {packageNames.add(basePackage);}for (Class<?> basePackageClass : attributes.getClassArray("basePackageClasses")) {packageNames.add(basePackageClass.getPackage().getName());}if (packageNames.isEmpty()) {packageNames.add(ClassUtils.getPackageName(metadata.getClassName()));}this.packageNames = Collections.unmodifiableList(packageNames);}
1.3.2 @Import(AutoConfigurationImportSelector.class)
1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
2、调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类
3、利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件
4、从META-INF/spring.factories位置来加载一个文件。默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories