初识Spring Boot 自动配置底层原理

7 阅读3分钟

先建立一个大脑模型:自动配置 = “菜单 + 条件 + 让你可覆盖”

把 Spring Boot 想成一家餐厅:

  1. 菜单(候选自动配置类清单) :Boot 先拿到“有哪些菜可以做”
  2. 条件(@Conditional) :看你有没有带食材(classpath 依赖)、你有没有自己做过这道菜(你自定义的 Bean)、你有没有打开开关(配置项)
  3. 可覆盖(OnMissingBean) :你自己做了,Boot 就不抢着做

官方也明确:自动配置类是常规的 @Configuration(Boot 里用 @AutoConfiguration 标记),并且大量依赖 @Conditional 来决定是否生效。(Home)


启动时到底发生了什么?按“真实链路”走一遍

第 0 步:入口是 @SpringBootApplication

它里面最关键的是:@EnableAutoConfiguration(自动配置核心)。(Home)

@EnableAutoConfiguration 这个注解本质做了一件事:
@Import(AutoConfigurationImportSelector.class) —— 把一个“选择器”导入进来。(Home)


第 1 步:为什么叫 Selector

因为它要“挑选”要导入的自动配置类。

AutoConfigurationImportSelector 是一个 DeferredImportSelector(延迟导入)。它的意义是:

先把你项目里自己写的 @Configuration@Bean 等处理完,再决定要不要导入哪些自动配置。
这样你自定义的 Bean 才能优先影响条件判断(例如 @ConditionalOnMissingBean)。(Home)


第 2 步:它从哪里拿到“菜单”(候选自动配置类列表)?

Spring Boot 会从依赖 jar 包里找一个清单文件(核心点):

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

里面每行是一个自动配置类的全限定名。官方文档明确提到了这份文件。(Home)

另外,@AutoConfiguration 的说明也写得很直接:
这些自动配置类是通过 ImportCandidates 机制定位的(也就是靠这类“imports 清单”)。(Home)

版本补充(重要):

  • 早期 Boot 主要用 spring.factories 来列自动配置
  • 2.7+ 开始引入并推荐使用 AutoConfiguration.imports(更轻、更快、更直观)(掘金)

第 3 步:拿到候选类后,Boot 会做“过滤 + 排序”

这一步你记住 3 件事就够了:

  1. 排除(exclude) :你可以通过注解 exclude 或配置排除某些自动配置(例如你不想要某个默认组件)。这一点在 @EnableAutoConfiguration 体系里就是内建能力。(Home)
  2. 排序(before/after) :自动配置之间有顺序(谁先谁后),@AutoConfiguration 支持 before/after 语义。(Home)
  3. 只导入“最终名单” :Selector 最终返回一串 class name,交给 @Import,注册进 IOC。

第 4 步:导入后,并不等于 Bean 全都创建了

导入的是“配置类”,配置类里有很多 @Bean 方法。

但这些 @Bean(甚至整个配置类)通常都带条件注解:

  • @ConditionalOnClass:类路径里有某个类才装配
  • @ConditionalOnMissingBean:你没自己定义过才装配(给你留后门)
  • @ConditionalOnProperty:配置开关满足才装配

官方对这一点的描述非常明确:自动配置“通常基于 classpath 和你定义的 beans 来决定应用哪些”。(Home)


自动配置包(Auto-configuration packages)是干嘛的?

很多自动配置需要“默认扫描范围”(比如 JPA 实体、Spring Data 仓库等)。
默认范围由 @EnableAutoConfiguration(以及它带的 @AutoConfigurationPackage)决定,默认就是启动类所在包及其子包。(Home)


你怎么“亲眼看到”自动配置做了什么?(调试必备)

有两种最实用的方式:

  1. 启动加 --debug 或开启 debug:会输出 Conditions Evaluation Report(条件评估报告),告诉你每个自动配置为什么生效/不生效。相关日志组件也专门用于打印这个报告。(Home)
  2. Actuator 的 /actuator/conditions:直接在运行时查看条件评估报告(非常直观)。(Home)

报告背后对应的数据结构就是 ConditionEvaluationReport。(Home)


一句话总结

@SpringBootApplication → @EnableAutoConfiguration → @Import(AutoConfigurationImportSelector) → 读取 AutoConfiguration.imports 得到候选配置类 → 排除/排序/过滤 → 导入配置类 → @Conditional 决定哪些 Bean 真正注册。 (Home)