主题
概念卡片: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 步:
- 加载
@EnableAutoConfiguration注解属性 SpringFactoriesLoader.loadFactoryNames()从META-INF/spring.factories加载候选配置类全限定名removeDuplicates()去重getExclusions()取排除项(@EnableAutoConfiguration的exclude/excludeName)checkExcludedClasses()校验- 移除排除类
- 条件过滤:按
@ConditionalOnClass/@ConditionalOnBean/@ConditionalOnMissingBean等判断是否装配 - 广播事件,返回
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 里的自动配置类,光引依赖不会自动装配。
常见误解(避坑)
- ❌ "自动装配是 @ComponentScan 干的"。→ @ComponentScan 只扫自己包,第三方 jar 的 Bean 靠 @EnableAutoConfiguration 装配。
- ❌ "引入 starter 就自动生效,无需任何条件"。→ 自动配置类都带
@ConditionalOnClass/@ConditionalOnMissingBean,缺关键类或用户已定义 Bean 时会自动跳过。 - ❌ "spring.factories 永远有效"。→ Boot 2.7 起改成
AutoConfiguration.imports,老路径机制已废弃。 - ❌ "@SpringBootApplication 是一个注解"。→ 是 7 个注解的复合注解(@Target/@Retention/@Documented/@Inherited/@SpringBootConfiguration/@EnableAutoConfiguration/@ComponentScan)。
关联
- 原始资料:✅@SpringBootApplication详解
- 总览:Spring技术栈总览
- 域地图:A00-百科/Java后端/Java后端