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 过滤条件,最终返回需要装配的类名数组。

相关推荐
9523620 小时前
MyBatis
后端·spring·mybatis
FQNmxDG4S1 天前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
虹科网络安全1 天前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje1 天前
Java语法进阶
java·开发语言·jvm
uzong1 天前
9 种 RAG 架构,每位 AI 开发者必学:完整实战指南
后端
HackTorjan1 天前
深度神经网络的反向传播与梯度优化原理
人工智能·spring boot·神经网络·机器学习·dnn
rKWP8gKv71 天前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫1 天前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287921 天前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本1 天前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka