SpringBoot自动装配

自动装配流程

flowchart LR
SpringBootApplication --> EnableAutoConfiguration --> AutoConfigurationImportSelector --> selectImports
1
2
3
4
5
6
7
8
9
public String[] selectImports(AnnotationMetadata annotationMetadata) {
// 判断自动装配开关是否打开
if (!this.isEnabled(annotationMetadata)) {
return NO_IMPORTS;
} else {
// 加载自动配置类
AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}

自动装配的具体实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
} else {
// 获取EnableAutoConfiguration注解中的 exclude 和 excludeName
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
// 获取需要自动装配的所有配置类,读取META-INF/spring.factories
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
// 移除需要排除的配置类
configurations = this.removeDuplicates(configurations);
Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
this.checkExcludedClasses(configurations, exclusions);
// 移除需要排除的配置类
configurations.removeAll(exclusions);
// 根据@ConditionalOnXXX过滤配置类
configurations = this.getConfigurationClassFilter().filter(configurations);
this.fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
}
}

自定义Starter

  1. 创建threadpool-spring-boot-starter工程

    1ff0ebe7844f40289eb60213af72c5a6_tplv-k3u1fbpfcp-watermark

  2. 引入 Spring Boot 相关依赖

    5e14254276604f87b261e5a80a354cc0_tplv-k3u1fbpfcp-watermark

  3. 创建ThreadPoolAutoConfiguration

    1843f1d12c5649fba85fd7b4e4a59e39_tplv-k3u1fbpfcp-watermark

  4. 在threadpool-spring-boot-starter工程的 resources 包下创建META-INF/spring.factories文件

    97b738321f1542ea8140484d6aaf0728~tplv-k3u1fbpfcp-watermark


SpringBoot自动装配
http://example.com/2023/03/09/框架/SpringBoot自动装配/
作者
UncleBryan
发布于
2023年3月9日
许可协议