ARTICLE · 1301193
Spring Boot 自动配置源码:@EnableAutoConfiguration 到底怎么加载配置
Spring Boot 自动配置源码:@EnableAutoConfiguration 到底怎么加载配置用过 Spring Boot 的人都知道它最大的亮点:零 XML、开箱即用、自动配置。 但绝大多数人只会背概念:"约定大于配置"、"根据依赖自动装配"。 一旦面试官追问一句:自动配置底层到底怎么实现的?@EnableAutoConfiguration 做了什么?配置类是怎么被加载的? 瞬间直接哑火。 今天这篇文章,不堆废话、不讲玄学,从源码层面彻底讲透 Spring Boot 自动配置的完整执行链路,看完直接搞定面试所有相关提问。 一、先纠正一个误区 很多新手以为:@SpringBootApplication 是 Spring Boot 自动配置的核心。 不对! 它只是一个三合一聚合注解: · @Configuration:标记当前类为配置类 · @ComponentScan:包扫描 · @EnableAutoConfiguration:真正的自动配置开关 也就是说:没有 @EnableAutoConfiguration,Spring Boot 没有任何自动配置能力。 二、核心入口:@EnableAutoConfiguration 源码 点开注解源码,你会发现它本质上依靠两个关键注解: 1.@Import(AutoConfigurationImportSelector.class) 这是自动配置的灵魂! Spring 中 @Import 的作用:手动导入第三方配置类。 而 AutoConfigurationImportSelector 是一个选择器类,负责: · 读取所有自动配置候选类 · 根据条件筛选生效配置 · 最终导入到 Spring 容器 2. @EnableAutoConfiguration 的完整能力 它的工作可以总结为一句话: 从配置文件加载所有自动配置类,再根据当前项目依赖、条件注解,决定哪些配置生效、哪些跳过。 三、完整源码执行流程(面试必背链路) 我把源码执行链路压缩成最清晰的 4 步流程,所有面试官都认这套逻辑: 第一步:启动时触发 AutoConfigurationImportSelector 项目启动刷新容器时,会执行 selectImports() 方法,这是自动配置的入口方法。 第二步:读取「自动配置候选列表」 底层会读取 Spring Boot 预设的配置清单: META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 这个文件里提前写死了几十、上百个自动配置类,例如: · WebMvcAutoConfiguration(Web 自动配置) · TomcatAutoConfiguration(容器自动配置) · DataSourceAutoConfiguration(数据源自动配置) · RedisAutoConfiguration(Redis 自动配置) 你引入什么 Starter,对应的配置类就准备就绪。 第三步:执行过滤、去重、排除 Spring Boot 不会无脑加载所有配置,它会做三层筛选: 1. 根据 @Conditional 条件注解判断,常见条件有: · 类路径存在才加载:@ConditionalOnClass · 容器没有该 Bean 才加载:@ConditionalOnMissingBean · 配置文件有对应参数才加载:@ConditionalOnProperty 2. 排除用户手动 exclude 的配置 3. 去重、排序,保证加载顺序 第四步:将生效配置类导入 IoC 容器 筛选通过的自动配置类,会被当成普通配置类解析: · 解析 @Bean · 注册组件 · 完成默认装配 至此:自动配置完成! 四、通俗大白话总结原理 我用最通俗的人话翻译一遍: Spring Boot 提前写好了所有场景的默认配置类,放在配置文件里。 项目启动时,程序会: 1. 把所有预设配置全部读出来 2. 看你项目引入了哪些依赖 jar 包 3. 看你容器里有没有自定义 Bean 4. 缺啥、符合条件就自动装配啥 你引入 web 依赖 → 触发 web 自动配置 你引入 redis 依赖 → 触发 redis 自动配置 你没引入数据库依赖 → 数据源配置直接跳过 这就是:按需自动装配。 五、为什么我们不用写 XML 了? 因为所有以前需要用 XML 写的 Bean、处理器、视图解析器、拦截器、事务配置,现在全部被封装成了 XXXAutoConfiguration 自动配置类。 启动时自动加载,彻底干掉 XML。 六、面试官高频追问答案(直接背) Q1:自动配置核心原理是什么? SPI 配置文件 + @Import 导入选择器 + 条件注解按需加载。 Q2:@EnableAutoConfiguration 的作用? 加载 Spring Boot 预设的自动配置类,根据当前环境动态装配 Bean,实现开箱即用。 Q3:为什么引入 starter 就能自动生效? 因为 starter 包里携带自动配置依赖,启动时被 imports 文件扫描到,条件匹配后自动装配。 Q4:如果我自定义 Bean,会覆盖默认配置吗? 会! 大量自动配置都加了 @ConditionalOnMissingBean。只要你手动 new 一个 Bean,默认配置直接失效,优先使用自定义 Bean。 这就是 Spring Boot 可扩展、可覆盖的核心设计。 七、工作中的真实价值 懂这套源码,你能解决工作中 90% 的疑难问题: · 配置不生效原因排查 · 自定义 starter 开发 · 自动配置冲突排查 · 启动报错、Bean 重复注册解决 · 框架底层定制扩展 只会 CRUD 永远提升不了薪资,懂底层原理才是中级、高级开发的分水岭。 Spring Boot 自动配置,看似简单,其实是整个 Spring Boot 框架最精妙的设计。 核心一句话总结: 提前预制配置 → 启动批量加载 → 条件动态筛选 → 缺啥装啥。 感兴趣可以持续关注。















































































