Spring Boot 自动配置原理的使用小结

 更新时间:2026年03月25日 09:09:45   作者:用户85116027612  
先按 Spring Boot 3.x 的主流实现来讲,并对比一下早期版本的差异。 Spring Boot 自动配置的核心,可以概括成一句话: Spring Boot 会在启动时,根据类路径里的依赖、当

先按 Spring Boot 3.x 的主流实现来讲,并对比一下早期版本的差异。

Spring Boot 自动配置的核心,可以概括成一句话:

Spring Boot 会在启动时,根据类路径里的依赖、当前环境、配置文件以及容器里是否已经存在某些 Bean,动态决定要不要加载某些默认配置类,从而自动帮你创建 Bean。

你可以按下面这套逻辑来理解和面试回答。

一、什么是自动配置

Spring Boot 的自动配置,意思是:

你只要引入了某些 starter 或 jar 包,Spring Boot 就会尝试“按约定”帮你把常用 Bean 配好。
例如类路径里有数据库相关依赖,而且你自己没有手动定义 DataSource,它就会自动配置数据源;如果你自己定义了同名或同类型 Bean,自动配置通常会“退让”。

所以它不是“无脑帮你全配”,而是:

  • 有条件地生效
  • 默认配置
  • 用户配置优先

二、自动配置从哪里开始

自动配置的入口,通常是启动类上的:

  • @SpringBootApplication
  • 或 @EnableAutoConfiguration

@SpringBootApplication 本身就包含了 @EnableAutoConfiguration,所以大多数项目其实都是通过 @SpringBootApplication 开启自动配置的。官方文档也明确说明,自动配置需要通过这两个注解之一显式启用。

三、自动配置的本质是什么

自动配置的本质其实不是魔法,它底层依然是 Spring 的 @Configuration 配置类机制。

也就是说,Spring Boot 所谓的“自动配置类”,本质上就是一批普通的配置类,只不过这些配置类上加了很多条件注解,例如:

  • @ConditionalOnClass
  • @ConditionalOnMissingBean
  • 以及其他 @Conditional... 注解

官方文档明确指出,自动配置类是标准的配置类,靠额外的条件注解来约束什么时候生效;其中最常见的就是“类路径里有某个类才生效”和“容器里没有用户自定义 Bean 才生效”。

所以你可以理解为:

自动配置 = 配置类 + 条件判断。

四、Spring Boot 怎么找到这些自动配置类

这部分是面试最爱问的。

1. Spring Boot 3.x / 4.x 主流机制

当前官方文档说明,Spring Boot 会在 jar 包中查找:

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

这个文件里按行列出所有自动配置类,Spring Boot 启动时会把这些类加载进来作为候选自动配置类。

2. 早期 Spring Boot 2.x 常见机制

较早版本里,自动配置类通常是通过:

META-INF/spring.factories

EnableAutoConfiguration 键下进行声明。官方 2.0 文档就是这样描述的。

所以面试里最好这样答:

早期版本主要通过 spring.factories 加载自动配置类,Spring Boot 3.x 以后主流是通过 AutoConfiguration.imports 文件加载。

五、自动配置为什么能“按需生效”

因为每个自动配置类上通常都会加条件注解,只有条件满足才会生效。

最常见的几个条件是:

1.@ConditionalOnClass

只有当类路径里存在某个类时,自动配置才生效。
比如引入了 DispatcherServlet、DataSource、RedisTemplate 等相关类,对应配置才有机会加载。

2.@ConditionalOnMissingBean

只有当 Spring 容器里没有某个 Bean 时,才创建默认 Bean。
这保证了“用户自定义优先于自动配置”。

3. 其他条件

还常见基于配置项、环境、Web 应用类型等条件的注解。
本质都是在启动阶段做一轮“匹配判断”,匹配成功才注册 Bean。

六、自动配置的大致执行流程

你可以把它理解成下面 5 步:

  1. 启动类上的 @SpringBootApplication 开启自动配置。
  2. Spring Boot 去读取自动配置候选文件,找到一批自动配置类;3.x 主要读 AutoConfiguration.imports,早期 2.x 常见是 spring.factories。
  3. 把这些自动配置类当作普通 @Configuration 类导入容器。
  4. 逐个判断这些配置类上的条件注解是否成立,比如类在不在、配置有没有、Bean 是否缺失。
  5. 条件满足的配置类生效,里面的 @Bean 被注册到 Spring 容器中;条件不满足的则跳过。用户自己定义的 Bean 通常会让自动配置“退让”。

七、为什么说“约定大于配置”

因为 Spring Boot 提前把很多常见场景的配置规则写好了:

  • 你引入什么依赖
  • 环境里有什么类
  • 你有没有手动声明 Bean
  • 配置文件有没有开启或关闭某功能

它会根据这些约定自动给你配默认值。
你不需要从零开始写大量 XML 或 Java 配置,这就是“约定大于配置”的体现。官方也强调,自动配置是基于你添加到类路径中的 jar 依赖来“尝试自动配置”应用。

八、自动配置和用户配置冲突时怎么办

Spring Boot 的设计原则是:

自动配置是补位,不是强覆盖。

如果你自己定义了配置,比如自己写了一个 DataSource Bean,那么默认的数据源自动配置通常会退让,不再重复创建。官方文档明确给出了这种“用户自定义后自动配置 backs away”的行为。

九、面试回答

Spring Boot 自动配置的原理,本质上是启动时通过 @EnableAutoConfiguration 导入一批自动配置类,这些自动配置类本质上都是普通的 @Configuration 配置类。Spring Boot 会从候选文件中加载这些自动配置类,早期 2.x 常见是 META-INF/spring.factories,3.x 以后主流是 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports。加载后,再结合 @ConditionalOnClass、@ConditionalOnMissingBean 等条件注解进行判断,只有在类路径、配置环境、Bean 状态等条件满足时,才会把对应 Bean 注册到容器中。如果用户已经自己定义了 Bean,自动配置通常会退让。因此自动配置的核心就是:候选配置类加载 + 条件装配 + 用户配置优先。

十、一句话总结

Spring Boot 自动配置就是:启动时加载一批预定义的配置类,再根据类路径、配置项和容器现状做条件判断,满足条件就自动注册 Bean,不满足就跳过,且用户自定义配置优先。

到此这篇关于Spring Boot 自动配置原理的使用小结的文章就介绍到这了,更多相关Spring Boot 自动配置原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中双冒号运算符(::)的用法详解

    Java中双冒号运算符(::)的用法详解

    在Java 8引入的Lambda表达式和函数式接口之后,双冒号运算符(::)成为了一项重要的功能,下面我们就来学习一下Java中的双冒号运算符及其常见应用场景吧
    2023-12-12
  • 解析ConcurrentHashMap: 预热(内部一些小方法分析)

    解析ConcurrentHashMap: 预热(内部一些小方法分析)

    ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment的结构和HashMap类似,是一种数组和链表结构,今天给大家普及java面试常见问题---ConcurrentHashMap知识,一起看看吧
    2021-06-06
  • Java class文件格式之特殊字符串_动力节点Java学院整理

    Java class文件格式之特殊字符串_动力节点Java学院整理

    特殊字符串出现在class文件中的常量池中,本着循序渐进和减少跨度的原则, 首先把class文件中的特殊字符串做一个详细的介绍, 然后再回过头来继续讲解常量池,对java class 文件格式相关知识感兴趣的的朋友一起学习吧
    2017-06-06
  • SpringBoot常用注解,thymeleaf,数据提交的实现

    SpringBoot常用注解,thymeleaf,数据提交的实现

    SpringBoot简化了微服务配置,提供快速启动和内嵌容器化web项目,常用注解包括@Component、@RestController等,Thymeleaf为前端页面渲染提供支持,数据提交时需使用@RequestBody注解
    2026-01-01
  • Java项目全面升级转化经验(涉及JDK、Spring boot版本及依赖管理架构)

    Java项目全面升级转化经验(涉及JDK、Spring boot版本及依赖管理架构)

    在软件开发领域,项目升级是一个必然的过程,随着技术的不断进步和业务需求的变化,对于旧项目的升级和优化已成为许多企业必须面对的问题,这篇文章主要介绍了Java项目全面升级转化的相关资料,包括JDK、Spring boot版本及依赖管理架构,需要的朋友可以参考下
    2025-09-09
  • Java 数据结构之删除链表中重复的结点

    Java 数据结构之删除链表中重复的结点

    在一个排序的链表中,会存在重复的结点,如何实现删除该链表中重复的结点,重复的结点不保留,并返回链表头指针呢?接下来小编将带你详细介绍
    2021-12-12
  • Java实现商品管理系统代码实例讲解

    Java实现商品管理系统代码实例讲解

    这篇文章主要介绍了Java实现商品管理系统代码实例讲解,文中代码实例讲解的很清楚,有需要的同学可以借鉴参考下
    2021-02-02
  • SpringBoot 配置文件中配置的中文,程序读取出来是乱码的解决

    SpringBoot 配置文件中配置的中文,程序读取出来是乱码的解决

    这篇文章主要介绍了SpringBoot 配置文件中配置的中文,程序读取出来是乱码的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java终止线程的几种方式实例总结

    Java终止线程的几种方式实例总结

    这篇文章主要给大家介绍了关于Java终止线程的几种方式,线程停止即Terminated状态是伴随run方法的结束而生,也就是run完成后由Thread类来决定线程停止了,销毁资源释放空间,下面需要的朋友可以参考下
    2023-06-06
  • springboot应用中使用过滤器的过程详解

    springboot应用中使用过滤器的过程详解

    过滤器通常用于实现跨切面的功能,例如身份验证、日志记录、请求和响应的修改、性能监控等,这篇文章主要介绍了springboot应用中使用过滤器,需要的朋友可以参考下
    2023-06-06

最新评论