Spring Boot 自动装配原理(超详细版)
全程不废话、全是考点,你背下来面试稳过。
一、一句话核心结论
Spring Boot 自动装配的本质就是:
在项目启动时,自动根据依赖和条件,把需要的 Bean 注册到 Spring 容器,省去手动配置。
设计思想:约定大于配置 + SPI 机制 + 条件装配。
二、整体流程(面试最标准口述顺序)
- 启动类上加
@SpringBootApplication - 该注解内部包含
@EnableAutoConfiguration @EnableAutoConfiguration通过 SPI 机制 读取
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件,加载所有自动配置类- 每个配置类上都有大量
@Conditional条件注解 - 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. 整体流程总结(面试最顺口述版)
- 启动类
@SpringBootApplication开启自动配置 - 通过
@EnableAutoConfiguration+@Import导入配置选择器 - 使用 SPI 机制读取
META-INF/spring/...imports里的所有自动配置类 - 每个配置类通过
@Conditional条件判断是否满足 - 满足条件则创建 Bean,放入 Spring 容器
- 配置通过
@ConfigurationProperties绑定,实现自动注入
最终效果:引入 starter → 自动装配 → 直接使用 Bean。
四、高频面试题(附带标准答案)
问:自动装配会把所有配置都加载吗?
不会。
只会加载满足 @Conditional 条件的配置类,其余会被跳过。
问:如何禁用某个自动配置?
java
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
问:为什么自己写的 Bean 会覆盖自动配置?
因为自动配置类上一般都加了:
@ConditionalOnMissingBean
你自己定义了,它就不自动创建了。
问:自动装配底层用到了哪些核心技术?
- SPI 机制(SpringFactoriesLoader)
- @Conditional 条件注解
- @Import 导入配置
- @ConfigurationProperties 配置绑定
五、如果你想"深度装X"(源码级)
你可以补一句:
AutoConfigurationImportSelector重写了selectImports()方法,内部调用
getAutoConfigurationEntry()→loadSpringFactories()去读取自动配置类,再经过
filter过滤条件,最终返回需要装配的类名数组。