SpringBoot 自动配置(AutoConfiguration)原理
在 SpringBoot 项目中,都需要在启动类上进行 @SpringBootApplication 注解,该注解定义如下:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration@Componen
·
在 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 中,存储了所有需要自动配置的信息:
更多推荐
已为社区贡献1条内容
所有评论(0)