晓风的码研工坊Java Dev Mentorship
返回技术分享框架源码

Spring Boot 自动装配原理源码解析

从 @SpringBootApplication 出发,逐层拆解自动装配的加载流程,理解条件装配的设计精妙之处。

2025-04-0215 分钟
Spring Boot 自动装配原理源码解析

Spring Boot 最迷人的地方在于"约定优于配置",而这一切的核心机制就是自动装配。理解自动装配原理,不仅能帮你在面试中从容应对源码追问,也能让你在实际项目中更好地排查"为什么这个 Bean 没有生效"这类问题。

一、入口:@EnableAutoConfiguration

@SpringBootApplication 是一个组合注解,其中 @EnableAutoConfiguration 是自动装配的真正入口。它通过 @Import(AutoConfigurationImportSelector.class) 引入了一个延迟装配的选择器。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
  String ENABLED_OVERRIDE_PROPERTY =
      "spring.boot.enableautoconfiguration";
}

二、自动配置类如何被发现

Spring Boot 2.7 之前依赖 META-INF/spring.factories 文件声明自动配置类,2.7 之后逐步迁移到 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件。加载后的配置类列表会经过去重、排序、条件过滤等多个步骤。

  • 通过 SpringFactoriesLoader 加载候选自动配置类全限定名列表
  • 使用 @AutoConfigureOrder / @AutoConfigureAfter 等注解决定加载顺序
  • 条件注解(@ConditionalOnClass、@ConditionalOnMissingBean 等)在此阶段完成过滤

三、条件装配的设计精妙之处

条件注解的底层依赖 Condition 接口与 ConditionEvaluator,在 Bean 定义注册阶段进行匹配判断。@ConditionalOnMissingBean 使得用户自定义的 Bean 总能覆盖自动配置提供的默认 Bean,这正是"约定优于配置,但配置优先于约定"的体现。

理解 @ConditionalOnMissingBean 的加载时机,你就能理解为什么自定义的 DataSource 总能"顶掉"默认的自动配置数据源。

四、常见面试追问

  • 自动配置类的加载顺序是如何保证的?
  • 如何自己写一个 Starter 并实现自动装配?
  • spring.factories 和 AutoConfiguration.imports 文件有什么区别?
#Spring Boot#源码阅读#自动装配
CONTACT

扫码咨询,聊聊你的辅导需求

添加微信备注「毕设 / 作业 / 面试 + 学校或岗位」,通常 2 小时内回复。

微信咨询二维码
长按识别 / 扫码添加
微信号xiaofengtech-top
响应时间周一至周五20:00-23:30,周六至周日 9:00 - 23:00(响应通常在 2 小时内)
  • 沟通后 24 小时内给出可行性评估与辅导方案
  • 辅导过程中的代码与文档全部归你所有
  • 进度延期或方向不合适可随时调整,不套模板打包卖课