Spring Boot 自动配置详解(Java进阶·源码级)
Spring Boot 自动配置核心:约定优于配置 + SPI 加载 + 条件注解按需生效 + 用户自定义Bean优先覆盖,告别传统Spring繁琐XML/Java配置,引入Starter即可开箱即用。
一、核心入口:@SpringBootApplication 组合注解
启动类注解三合一, @EnableAutoConfiguration 是自动配置总开关
@SpringBootConfiguration // 标记当前类为配置类
@EnableAutoConfiguration // 开启自动配置(核心)
@ComponentScan // 扫描当前包及子包组件
public class DemoApplication {}
- @SpringBootConfiguration 等价
@Configuration,将启动类注册为Spring配置类 - @AutoConfigurationPackage(内嵌于@EnableAutoConfiguration) 注册启动类所在包为默认扫描根路径,无需手动配置包扫描
- @Import(AutoConfigurationImportSelector.class) 导入自动配置选择器,整个自动配置流程由此触发
二、自动配置完整执行流程(源码链路)
1. 加载所有候选配置类(Spring SPI 机制)
-
AutoConfigurationImportSelector 调用 SpringFactoriesLoader - 扫描所有Jar包:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(新版)/spring.factories(旧版) - 读取
EnableAutoConfiguration对应的数百个预置自动配置全类名(Web、数据源、Redis、MyBatis等)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
2. 条件过滤(核心智能筛选)
海量候选类不会全部加载,通过@Conditional系列注解严格校验,不满足直接丢弃
| 条件注解 | 作用 | 典型场景 |
|---|---|---|
| @ConditionalOnClass | 类路径存在指定Class才生效 | 引入mybatis-spring-boot-starter才加载MyBatis配置 |
| @ConditionalOnMissingBean | 容器没有该Bean,才创建默认Bean | 用户自定义DataSource,Spring就不自动配 |
| @ConditionalOnProperty | 配置文件指定开关开启才生效 | spring.redis.enable=true 才加载Redis配置 |
| @ConditionalOnWebApplication | Web环境才生效 | 嵌入式Tomcat相关配置 |
3. 排序、去重、排除
- 按
@AutoConfigureBefore/@AutoConfigureAfter指定依赖顺序 - 排除
@SpringBootApplication(exclude = xxx.class)手动禁用配置 - 去重合并,最终只保留当前项目需要的少量配置类
4. 注册Bean到IOC容器
过滤后的配置类被Spring解析,批量创建Bean、绑定yml/properties配置、初始化嵌入式容器,应用启动完成
三、核心底层原理
1. Starter 与自动配置关系
- Starter = 依赖聚合 + 触发自动配置
- 引入
spring-boot-starter-web → 导入Tomcat、WebMvc依赖 → 触发Web相关自动配置 - 自定义Starter:只需编写自动配置类 + SPI配置文件,即可无缝接入Spring Boot
2. 用户配置优先级规则(高频面试)
自定义Bean > Spring Boot 默认自动配置Bean
- 你手动写
@Bean DataSource,Spring Boot 数据源自动配置直接失效 - 配置文件
application.yml属性,覆盖自动配置默认值
3. 新旧版本SPI差异
- Spring Boot 2.7.x 之前:
META-INF/spring.factories - Spring Boot 2.7.x+:推荐
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,性能更高、加载更快
四、常用实操配置
1. 禁用指定自动配置
// 排除数据源自动配置
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
2. 查看所有生效自动配置
启动日志开启debug:
debug: true
控制台打印Positive matches(生效)、Negative matches(未生效)
五、面试高频总结
- 入口:
@SpringBootApplication → @EnableAutoConfiguration → AutoConfigurationImportSelector - 加载:
SpringFactoriesLoader 读取SPI文件,获取候选配置 - 筛选:
@Conditional 条件注解按需生效 - 规则:依赖存在才配、用户没配才默认配、自定义Bean优先
- 本质:提前写好所有场景配置,运行时智能匹配生效
需要我给你整理手写自定义Starter+自动配置完整实战代码吗?