1. 引言
在前几篇文章中,我们探讨了 SpringBoot 的启动流程及其扩展机制。在本篇文章中,我们将深入分析 SpringBoot 的自动配置(AutoConfiguration)机制,这是 SpringBoot 最具特色和强大的功能之一。
2. 自动配置概述
SpringBoot 的自动配置机制旨在根据项目中的类路径和配置属性,自动配置 Spring 应用程序。通过自动配置,开发者无需编写大量的配置代码,就可以快速启动和运行 Spring 应用程序。
2.1 自动配置的工作原理
-
条件注解:自动配置类使用条件注解(如 @ConditionalOnClass, @ConditionalOnMissingBean 等)来判断是否需要进行某些配置。
-
配置文件:自动配置类通常会读取配置文件中的属性,并根据这些属性进行配置。
-
优先级:通过 @AutoConfigureOrder 注解来控制自动配置类的优先级。
2.2 自动配置的入口
自动配置的入口位于 spring.factories 文件中。SpringBoot 使用 SpringFactoriesLoader 加载这些自动配置类。
spring.factories 文件示例
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration
3. EnableAutoConfiguration 注解
3.1 @EnableAutoConfiguration 定义
@EnableAutoConfiguration 是 SpringBoot 自动配置的核心注解,它用于启用自动配置功能。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
// 排除特定的自动配置类
Class<?>[] exclude() default {};
// 排除特定的自动配置类名称
String[] excludeName() default {};
}
-
@AutoConfigurationPackage:用于自动配置包扫描路径。
-
@Import(AutoConfigurationImportSelector.class):导入 AutoConfigurationImportSelector,该类用于收集和注册自动配置类。
3.2 @SpringBootApplication 注解
@SpringBootApplication 注解是一个复合注解,包含了 @EnableAutoConfiguration。
@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 {
// ...
}
4. AutoConfigurationImportSelector 类
AutoConfigurationImportSelector 类负责从 spring.factories 文件中加载自动配置类,并将其导入到 Spring 应用上下文中。
4.1 selectImports 方法
selectImports 方法是 AutoConfigurationImportSelector 的核心方法,它负责选择要导入的自动配置类。
@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());
}
-
isEnabled:检查自动配置是否启用。
-
AutoConfigurationMetadataLoader:加载自动配置元数据。
-
getAutoConfigurationEntry:获取自动配置条目。
4.2 getAutoConfigurationEntry 方法
getAutoConfigurationEntry 方法用于获取自动配置类的条目。
protected AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata,
AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
}
AnnotationAttributes attributes = getAttributes(annotationMetadata);
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
configurations = removeDuplicates(configurations);
configurations = sort(configurations, autoConfigurationMetadata);
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = filter(configurations, autoConfigurationMetadata);
fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationEntry(configurations, exclusions);
}
-
getCandidateConfigurations:获取候选的自动配置类。
-
removeDuplicates:移除重复的配置类。
-
sort:对配置类进行排序。
-
getExclusions:获取排除的配置类。
-
checkExcludedClasses:检查排除的配置类。
-
filter:过滤配置类。
-
fireAutoConfigurationImportEvents:触发自动配置导入事件。
5. 创建自定义自动配置
5.1 编写自动配置类
编写一个自动配置类,并使用 @Configuration 和条件注解。
@Configuration
@ConditionalOnClass(MyService.class)
@ConditionalOnMissingBean
public class MyAutoConfiguration {
@Bean
public MyService myService() {
return new MyService();
}
}
5.2 配置 spring.factories 文件
在 META-INF/spring.factories 文件中配置自动配置类。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration
6. 结论
通过深入分析 SpringBoot 的自动配置机制,我们了解了其工作原理和实现细节。自动配置机制是 SpringBoot 强大和易用的关键,它能够根据项目需求自动配置各种组件,大大简化了开发过程。在接下来的文章中,我们将继续探讨 SpringBoot 的其他重要特性和实现细节。
标签:SpringBoot,Spring,配置,Boot,annotationMetadata,源码,自动,EnableAutoConfiguration,confi From: https://blog.csdn.net/weixin_53391173/article/details/139840696