Spring 源码系列(20): @SpringBootApplication 三注解拆解

📌 阅读前提示 :进入 Spring Boot 阶段(第 20--24 篇) 。Boot 是「约定优于配置」的封装层,但底层全是前面学的 IoC / BPP / 条件注解。本篇先拆 @SpringBootApplication------一个注解背后其实是三个注解的复合,理解它你就拿到了 Boot 自动化的「总开关」。


一、引子:一个注解启动了整个生态

java 复制代码
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

@SpringBootApplication 不是新机制,它是三个注解的「语法糖」:

java 复制代码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@SpringBootConfiguration      // = @Configuration(标记配置类)
@EnableAutoConfiguration      // ★ 自动配置的总开关
@ComponentScan(...)           // ★ 包扫描,默认扫当前类所在包及子包
public @interface SpringBootApplication {}

二、三大组成逐一拆解

2.1 @SpringBootConfiguration

就是一个 @Configuration,让你这个启动类本身成为配置源(可在里面写 @Bean)。

java 复制代码
@Configuration
public @interface SpringBootConfiguration {}

2.2 @ComponentScan

默认扫描启动类所在包及其子包 下的 @Component / @Service / @Controller / @Repository。这也是为什么「启动类要放在根包」------扫不到就 Bean 不注册。

⚠️ 易错点 :如果 Controller 放在启动类包之外 且没额外配置 scanBasePackages,这些 Bean 不会被注册,访问就 404。

2.3 @EnableAutoConfiguration(核心)

java 复制代码
@AutoConfigurationPackage        // 把启动类所在包注册进容器(供自动配置按包定位)
@Import(AutoConfigurationImportSelector.class)   // ★ 加载所有自动配置类
public @interface EnableAutoConfiguration {}

AutoConfigurationImportSelector 是自动配置的「发动机」------它读取 META-INF/spring.factories(Boot 2.7 起逐步迁移到 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports),把所有 xxxAutoConfiguration 类批量导入容器。第 21 篇会深挖。


三、三个注解的协作关系

复制代码
@SpringBootApplication
 ├ @SpringBootConfiguration → 启动类成为 @Configuration
 ├ @ComponentScan           → 扫描你的业务 Bean(@Controller/@Service...)
 └ @EnableAutoConfiguration → 导入框架自带的 xxxAutoConfiguration(按条件生效)
        ↓
   你的 Bean + 框架的自动配置 Bean,共同组成一个 ApplicationContext

💡 关键认知 :自动配置类也是普通 @Configuration,只不过它们带 @Conditional 条件------满足条件(比如 classpath 有某个类)才生效。这就是「约定优于配置」的本质。


四、@SpringBootApplication 三注解拆解图


五、常见误区

误区 正解
@SpringBootApplication 是全新机制 不,是 @Configuration+@ComponentScan+@EnableAutoConfiguration 的复合
自动配置类无条件全部生效 错,大多带 @Conditional,按 classpath/环境按需生效
启动类放哪都行 默认只扫启动类所在包及子包,放错位置 Bean 扫不到
@EnableAutoConfiguration 直接 new Bean 不,它 @Import 一个 Selector 去批量导入配置类
自动配置优先级高于你的 @Bean 你的 @Bean 通常优先级更高(可覆盖自动配置,第 21 篇详述)

🧪 面试题自测

  1. @SpringBootApplication 由哪三个注解组成?各自作用?
  2. 为什么启动类要放在根包?
  3. @EnableAutoConfiguration 靠什么类批量导入配置?
  4. 自动配置类为什么不会全部生效?
  5. @SpringBootConfiguration@Configuration 什么关系?
  6. 自动配置和你自己写的 @Bean 冲突时谁优先?

🔧 Debug 小技巧

AutoConfigurationImportSelector.getCandidateConfigurations 打断点,观察它返回的所有自动配置类名(几百个);再在 ConditionEvaluator.shouldSkip 断点,看某个 xxxAutoConfiguration 如何因 @ConditionalOnClass 不满足而被跳过。


下一篇预告

第 21 篇:自动配置原理深挖------AutoConfigurationImportSelector 如何读取配置、如何排序、你的 @Bean 为何能覆盖自动配置;以及 Boot 2.7 的 imports 文件与旧版 spring.factories 的差异。


如果这篇对你有帮助,欢迎 点赞 · 收藏 · 关注 三连支持。

Spring 源码系列共 30 篇,由浅入深持续更新中。有疑问或想深挖的源码点,评论区告诉我,下篇见。

相关推荐
吴长建先生几秒前
ASP.NET Core WebAPI 服务在 IM 即时
java
MuMuMu12233 分钟前
文旅户外场景智能回收终端工程难点解析:越华环保集团碳惠小屋耐候与供电系统实践
java·大数据·算法
小鹿的周先生6 分钟前
第 3 篇:Spring AI System Prompt 实战——为 AI 助手设置角色和行为规则
人工智能·spring·prompt
偷偷写博客6 分钟前
Gitee → GitHub 自动同步配置手册
java
西峰u7 分钟前
Java IO 完整学习笔记|字节流、字符流、缓冲流、资源关闭全梳理
java·笔记·学习
L-岁月染过的梦8 分钟前
把常用开发小工具收进 IDEA:Develop Helper 插件介绍
java·数据库·intellij-idea
雄哥00712 分钟前
java代码反编译CFR
java·开发语言·反编译·cfr
PBitW12 分钟前
Travel Planner — 智能旅行行程规划助手
前端·后端
lsylalalala16 分钟前
多线程(2)
java·开发语言·多线程
王川70820 分钟前
Vue3 + uni-app 给商会小程序做一个动态表单引擎(
后端