Skip to content

概念卡片:SpringBoot 自动装配原理

一句话机制

@SpringBootApplication 是一个复合注解,核心是 @EnableAutoConfiguration:它通过 @Import(AutoConfigurationImportSelector.class) 从 classpath 里所有 META-INF/spring.factories 中加载 EnableAutoConfiguration 对应的配置类,经去重、排除、条件过滤后反射实例化并注册进 IoC 容器,实现「引入依赖即自动配置」。

复合注解拆解

java
@SpringBootConfiguration   // = @Configuration,声明为配置类
@EnableAutoConfiguration   // 自动装配的核心
@ComponentScan(excludeFilters = {...})  // 扫包注册 @Component 及其子注解
public @interface SpringBootApplication { }

三个核心注解各司其职:

注解作用
@SpringBootConfiguration底层是 @Configuration,把启动类标记为配置类
@ComponentScan扫描启动类所在包下的 @Component/@Repository 等组件(默认不指定 basePackages 时扫所在 package)
@EnableAutoConfiguration装配第三方 jar 提供的配置类(这是自动装配的灵魂)

不变量@ComponentScan 管「自己包的 Bean」,@EnableAutoConfiguration 管「第三方 jar 的 Bean」,两者职责不同、不可互相替代。启动类放 root package 才能让默认扫描覆盖全部子包。

@EnableAutoConfiguration 的主流程

java
@AutoConfigurationPackage                          // 注册启动类所在包
@Import(AutoConfigurationImportSelector.class)      // 核心:导入选择器
public @interface EnableAutoConfiguration { }

AutoConfigurationImportSelector.selectImports()getAutoConfigurationEntry() 主流程 8 步:

  1. 加载 @EnableAutoConfiguration 注解属性
  2. SpringFactoriesLoader.loadFactoryNames()META-INF/spring.factories 加载候选配置类全限定名
  3. removeDuplicates() 去重
  4. getExclusions() 取排除项(@EnableAutoConfigurationexclude/excludeName
  5. checkExcludedClasses() 校验
  6. 移除排除类
  7. 条件过滤:按 @ConditionalOnClass/@ConditionalOnBean/@ConditionalOnMissingBean 等判断是否装配
  8. 广播事件,返回 AutoConfigurationEntry

一句话:从 classpath 找 spring.factories → 去重 → 排除 → 条件过滤 → 反射实例化注册

⚠️ 版本差异(源文已过时)

源文讲的是 META-INF/spring.factories 机制,仅适用于 Spring Boot 1.x/2.6 及之前。自 Spring Boot 2.7 起,自动配置类清单改为 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件(每个类一行),spring.factories 里的 EnableAutoConfiguration 键已废弃。面试/排查时先确认 Boot 版本,否则按老路径找文件会扑空。

与 Starter 的关系

starter = 依赖聚合 + 自动配置类。 starter 只是把一组相关依赖(如 spring-boot-starter-data-redis)打包引入,真正的「零配置」来自 jar 内附带的 AutoConfiguration.imports/spring.factories 里的配置类 + @ConditionalOnClass 判断。没有 starter 里的自动配置类,光引依赖不会自动装配。

常见误解(避坑)

  1. ❌ "自动装配是 @ComponentScan 干的"。→ @ComponentScan 只扫自己包,第三方 jar 的 Bean 靠 @EnableAutoConfiguration 装配。
  2. ❌ "引入 starter 就自动生效,无需任何条件"。→ 自动配置类都带 @ConditionalOnClass/@ConditionalOnMissingBean,缺关键类或用户已定义 Bean 时会自动跳过。
  3. ❌ "spring.factories 永远有效"。→ Boot 2.7 起改成 AutoConfiguration.imports,老路径机制已废弃。
  4. ❌ "@SpringBootApplication 是一个注解"。→ 是 7 个注解的复合注解(@Target/@Retention/@Documented/@Inherited/@SpringBootConfiguration/@EnableAutoConfiguration/@ComponentScan)。

关联

最近更新