Spring Boot自动装配原理

Spring Boot 自动装配原理(超详细版)

全程不废话、全是考点,你背下来面试稳过。


一、一句话核心结论

Spring Boot 自动装配的本质就是:
在项目启动时,自动根据依赖和条件,把需要的 Bean 注册到 Spring 容器,省去手动配置。

设计思想:约定大于配置 + SPI 机制 + 条件装配


二、整体流程(面试最标准口述顺序)

  1. 启动类上加 @SpringBootApplication
  2. 该注解内部包含 @EnableAutoConfiguration
  3. @EnableAutoConfiguration 通过 SPI 机制 读取
    META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
    文件,加载所有自动配置类
  4. 每个配置类上都有大量 @Conditional 条件注解
  5. Spring 根据条件判断是否满足,满足则创建 Bean 并注入容器

三、逐层拆解原理(面试重点)

1. 入口注解:@SpringBootApplication

它是一个复合注解,包含 3 个核心:

java 复制代码
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
  • @SpringBootConfiguration:标记为配置类
  • @ComponentScan:包扫描
  • @EnableAutoConfiguration:自动装配真正入口

2. 核心注解:@EnableAutoConfiguration

内部关键是:

java 复制代码
@Import(AutoConfigurationImportSelector.class)

@Import 导入了 AutoConfigurationImportSelector

它的作用就是:去加载所有自动配置类


3. SPI 机制:去哪里找配置类?

Spring Boot 使用 SpringFactoriesLoader(SPI) 去加载:

复制代码
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

这个文件里列出了所有 xxxAutoConfiguration,比如:

  • WebMvcAutoConfiguration
  • DataSourceAutoConfiguration
  • MybatisAutoConfiguration
  • RedisAutoConfiguration
  • AopAutoConfiguration
    ...

Spring Boot 启动时会把这些类全部加载进来。


4. 条件装配:@Conditional 系列(灵魂)

不是所有配置类都会生效,而是满足条件才装配

常用条件:

  • @ConditionalOnClass:类路径存在某个类
  • @ConditionalOnMissingClass:不存在某个类
  • @ConditionalOnBean:容器中存在某个 Bean
  • @ConditionalOnMissingBean:容器中没有这个 Bean(常用)
  • @ConditionalOnProperty:配置文件存在某个配置
  • @ConditionalOnWebApplication:是 Web 应用

示例(RedisAutoConfiguration 简化):

java 复制代码
@Configuration
@ConditionalOnClass(RedisTemplate.class)
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public RedisTemplate redisTemplate() {
        return new RedisTemplate();
    }
}

意思:

  • 有 RedisTemplate 类才生效
  • 用户没自己定义 RedisTemplate 才自动创建

这就是为什么我们只引 starter 就能直接用 RedisTemplate


5. 配置绑定:@ConfigurationProperties

自动配置需要读取 application.yml

通过 @ConfigurationProperties(prefix = "spring.redis")

把配置文件内容绑定到 Java 类。

再通过 @EnableConfigurationProperties 加入容器。


6. 整体流程总结(面试最顺口述版)

  1. 启动类 @SpringBootApplication 开启自动配置
  2. 通过 @EnableAutoConfiguration + @Import 导入配置选择器
  3. 使用 SPI 机制读取 META-INF/spring/...imports 里的所有自动配置类
  4. 每个配置类通过 @Conditional 条件判断是否满足
  5. 满足条件则创建 Bean,放入 Spring 容器
  6. 配置通过 @ConfigurationProperties 绑定,实现自动注入

最终效果:引入 starter → 自动装配 → 直接使用 Bean


四、高频面试题(附带标准答案)

问:自动装配会把所有配置都加载吗?

不会。

只会加载满足 @Conditional 条件的配置类,其余会被跳过。

问:如何禁用某个自动配置?

java 复制代码
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

问:为什么自己写的 Bean 会覆盖自动配置?

因为自动配置类上一般都加了:
@ConditionalOnMissingBean

你自己定义了,它就不自动创建了。

问:自动装配底层用到了哪些核心技术?

  • SPI 机制(SpringFactoriesLoader)
  • @Conditional 条件注解
  • @Import 导入配置
  • @ConfigurationProperties 配置绑定

五、如果你想"深度装X"(源码级)

你可以补一句:

AutoConfigurationImportSelector 重写了 selectImports() 方法,内部调用
getAutoConfigurationEntry()loadSpringFactories()

去读取自动配置类,再经过 filter 过滤条件,最终返回需要装配的类名数组。

相关推荐
前鼻音太阳熊8 分钟前
【MES系统】MES为什么需要SSE?从设备实时监控谈Spring Boot流式推送设计
java·spring boot·后端
Lhappy嘻嘻11 分钟前
网络初识|基础入门:局域网广域网、IP 端口、TCP/IP 五层模型与封装解封装全过程
java·开发语言·网络·笔记·网络协议·tcp/ip
卷无止境12 分钟前
Guardrails.ai:为大语言模型加一道"安全阀"
后端·python
Java面试题总结15 分钟前
区间树:反向映射的前置数据结构
java·前端·数据结构
尚早立志30 分钟前
六)Spring Boot 源码研读之prepareContext 准备上下文
java·spring boot·后端·spring
Dovis(誓平步青云)1 小时前
《Linux CPU频率为何忽高忽低:cpufreq、idle状态与性能抖动教程》
linux·运维·服务器·spring boot·后端·生成对抗网络
Lhappy嘻嘻8 小时前
Java IO|File 文件操作 + 字节流 / 字符流完整笔记 + 递归删除文件实战
java·笔记·php
To_OC9 小时前
手写 AI 编程 Agent 的命令执行工具:我被 child_process 坑出来的实战经验
后端·node.js·agent
伊玛目的门徒9 小时前
试用leetcode之典中典 二数之和问题
java·算法·leetcode
逝水无殇11 小时前
C# 异常处理详解
开发语言·后端·c#