【JAVA 进阶】Spring Boot自动配置详解

5 阅读3分钟

Spring Boot 自动配置详解(Java进阶·源码级)

Spring Boot 自动配置核心:约定优于配置 + SPI 加载 + 条件注解按需生效 + 用户自定义Bean优先覆盖,告别传统Spring繁琐XML/Java配置,引入Starter即可开箱即用。

一、核心入口:@SpringBootApplication 组合注解

启动类注解三合一, @EnableAutoConfiguration 是自动配置总开关

@SpringBootConfiguration    // 标记当前类为配置类
@EnableAutoConfiguration    // 开启自动配置(核心)
@ComponentScan              // 扫描当前包及子包组件
public class DemoApplication {}
  1. @SpringBootConfiguration 等价​​@Configuration​​,将启动类注册为Spring配置类
  2. @AutoConfigurationPackage(内嵌于@EnableAutoConfiguration) 注册启动类所在包为默认扫描根路径,无需手动配置包扫描
  3. @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配置
@ConditionalOnWebApplicationWeb环境才生效嵌入式Tomcat相关配置

3. 排序、去重、排除

  1. 按​​@AutoConfigureBefore/@AutoConfigureAfter​​指定依赖顺序
  2. 排除​​@SpringBootApplication(exclude = xxx.class)​​手动禁用配置
  3. 去重合并,最终只保留当前项目需要的少量配置类

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​​(未生效)

五、面试高频总结

  1. 入口:​​@SpringBootApplication​​ → ​​@EnableAutoConfiguration​​ → ​​AutoConfigurationImportSelector​
  2. 加载:​​SpringFactoriesLoader​​ 读取SPI文件,获取候选配置
  3. 筛选:​​@Conditional​​ 条件注解按需生效
  4. 规则:依赖存在才配、用户没配才默认配、自定义Bean优先
  5. 本质:提前写好所有场景配置,运行时智能匹配生效

需要我给你整理手写自定义Starter+自动配置完整实战代码吗?