在 SpringBoot 项目中,都需要在启动类上进行 @SpringBootApplication 注解,该注解定义如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication

可见,该注解是一个复合注解,注意 @EnableAutoConfiguration,点击查看:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration

注意到 @Import,查看 AutoConfigurationImportSelector。AutoConfigurationImportSelector 是 ImportSelector 的实现类,那我们主要看它的实现方法 selectImports():

@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
	if (!isEnabled(annotationMetadata)) {
		return NO_IMPORTS;
	}
	AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
			.loadMetadata(this.beanClassLoader);
	AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata,
			annotationMetadata);
	return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}

注意到 AutoConfigurationMetadataloader,观察源码,发现它定义了一个 PATH,这是存储自动配置元数据的文件相对路径:

在 spring-boot-autoconfigure 包下的 META-INF/spring-autoconfigure-metadata.properties 中,存储了所有需要自动配置的信息:

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐