自动配置源码
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {
@Filter(
type = FilterType.CUSTOM,
classes = {
TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {
AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
- @SpringBootConfiguration 点进后也是@Configuration。证明:MainApplication也是一个配置类(主程序)(次)
- @ComponentScan指定扫描内容(次)
- @EnableAutoConfiguration(主)
@AutoConfigurationPackage
@Import({
AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
中的核心注解①:
@AutoConfigurationPackage点进发现此注解上声明@Import({Registrar.class})
// 利用Registar给容器中导入一系列组件
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
// 调用register(),将主运行程序MainApplication所对应包的此包下所有组件导入
register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
}
@Override
public Set<Object> determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new PackageImports(metadata));
}
}
中的核心注解②@Import({AutoConfigurationImportSelector.class})
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
// 给容器批量导入一些组件,点进getAutoConfigurationEntry()
AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
}
AnnotationAttributes attributes = getAttributes(annotationMetadata);
// 获取所有候选配置,获取所有需要导入到容器的配置类
// 加载所有组件保存在Map中,private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
// loadSpringFactories()从META-INF/spring.factories位置加载一个文件,系统扫描所有META-INF/spring.factories位置文件,为了去扫描spring-boot-autoconfigure-2.3.4.RELEASE.jar下的spring.factories文件内部的127条# Auto Configure(springboot启动时加载的所有配置类)
// org.springframework.boot.autoconfigure.*,共127个配置类将会 按需开启。
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);
}
按需开启127个自动配置项
得益于springboot按需加载注解@Conditional,进行条件装配。