SpringBoot 自动配置机制与条件注解

spring 📚 learning spring-boot-autoconfiguration · spring · springboot · autoconfiguration · conditional · starter

TL;DR(30 秒扫完)

  • SpringBoot 定位:Spring 的封装,提供约定大于配置、自动配置、Starter 依赖管理,快速启动服务
  • @SpringBootApplication:= @EnableAutoConfiguration + @ComponentScan + @Configuration
  • 自动配置机制:AutoConfigurationImportSelector 扫描 spring.factories(2.x)/ AutoConfiguration.imports(3.x),通过条件注解(@ConditionalOnClass / @ConditionalOnMissingBean / @ConditionalOnProperty)决定是否生效

关键结论

结论 A(定位)SpringBoot 是 Spring 的封装,提供约定大于配置、自动配置、Starter 依赖管理,快速启动服务
结论 B(@SpringBootApplication)= @EnableAutoConfiguration + @ComponentScan + @Configuration
结论 C(自动配置)AutoConfigurationImportSelector 扫描配置类,通过条件注解决定是否生效
结论 D(版本差异)Spring Boot 2.x 使用 spring.factories,3.x 使用 AutoConfiguration.imports

完整讲解(费曼四步)

STEP 1 · 概念(一句话定义)

  • SpringBoot:Spring 的封装框架,提供约定大于配置、自动配置、Starter 依赖管理,快速启动服务
  • 自动配置:SpringBoot 根据类路径中的依赖和配置,自动配置 Spring 应用程序的能力
  • 条件注解:根据某些条件(类路径、配置、Bean 存在等)决定是否生效的注解

STEP 2 · 大白话(生活类比)

类比(SpringBoot):就像宜家家具——你只需要买回家(引入 Starter),按照说明书组装(约定大于配置),就能快速使用(自动配置),不需要自己设计图纸(Spring 配置)。

STEP 3 · 底层(细节 + 代码/表格)

3.1 @SpringBootApplication 拆解

@SpringBootConfiguration  // = @Configuration
@EnableAutoConfiguration  // 自动配置核心
@ComponentScan           // 组件扫描
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

3.2 自动配置机制

扫描流程:
  • @EnableAutoConfiguration 触发 AutoConfigurationImportSelector
  • 扫描 spring.factories(2.x)/ AutoConfiguration.imports(3.x)
  • 加载自动配置类(如 WebMvcAutoConfiguration、DataSourceAutoConfiguration)
  • 通过条件注解决定是否生效
条件注解家族:
注解条件
@ConditionalOnClass类路径中存在某个类
@ConditionalOnMissingBean容器中不存在某个 Bean
@ConditionalOnProperty配置文件中存在某个属性
@ConditionalOnWebApplication是 Web 应用
@ConditionalOnNotWebApplication不是 Web 应用

3.3 版本差异

特性Spring Boot 2.xSpring Boot 3.x
配置文件spring.factoriesAutoConfiguration.imports
最低 JDK817
包名前缀javax.*jakarta.*
配置属性spring.xxxspring.xxx(部分重命名)

3.4 内嵌容器

SpringBoot 内置 Tomcat / Jetty / Undertow,启动时自动创建内嵌容器,无需外部部署。
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
        // 内嵌容器启动,监听 8080 端口
    }
}

STEP 4 · 简化(比喻/口诀)

SpringBoot 口诀:@SpringBootApplication 三合一,AutoConfiguration 扫配置,条件注解决定生效,约定大于配置快速启。
版本差异口诀:2.x 用 spring.factories,3.x 用 imports,JDK 8→17,javax→jakarta。

速查表

SpringBoot · 约定大于配置 · 自动配置 · Starter 依赖管理 · 内嵌容器
@SpringBootApplication · @EnableAutoConfiguration + @ComponentScan + @Configuration
自动配置 · AutoConfigurationImportSelector 扫描 · spring.factories(2.x)/imports(3.x) · 条件注解决定生效
版本差异 · 2.x: spring.factories/JDK8/javax · 3.x: imports/JDK17/jakarta
常见错点:SpringBoot 是独立框架 ❌ / 自动配置全自动 ❌ / 2.x 和 3.x 没区别 ❌

Anki 候选卡片

Q: @SpringBootApplication 包含哪三个注解?
A: @EnableAutoConfiguration + @ComponentScan + @Configuration
Q: Spring Boot 2.x 和 3.x 的配置文件差异是什么?
A: 2.x 用 spring.factories,3.x 用 AutoConfiguration.imports
Q: 自动配置的"约定大于配置但可覆盖"机制是什么?
A: 用户显式 @Bean 优先于自动配置的默认实现(通过 @ConditionalOnMissingBean 实现)
Q: SpringBoot 内置哪些容器?
A: Tomcat / Jetty / Undertow
Q: Spring Boot 3.x 的最低 JDK 版本是什么?
A: JDK 17

关联题目

  • [ ] 《SpringBoot 和 Spring 的区别是什么?》—— 2026-09-28 Round 1, 评分 ⭐⭐⭐⭐
  • 关联知识

    @SpringBootApplication 三合一;AutoConfigurationImportSelector 扫描配置类;条件注解决定是否生效
    ✦ 记 忆 口 诀 ✦
    @SpringBootApplication 三合一 / AutoConfiguration 扫配置 / 条件注解决定生效
    关键可视化
    暂无可视化
    知识关系

    ⬆️ 前置(Prerequisite)

    spring-ioc-core

    🔄 延伸(Extends)

    暂无

    ⚡ 对比(Contrast)

    暂无
    🎯 概念 📏 规则 ⚠️ 误区 🔍 追问 ✨ 口诀 共 0 张卡,点击翻面