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

相关推荐
gugucoding9 分钟前
59. 【Java】Spring Boot 入门:第一个 Web 应用
java·开发语言·spring boot
IT_陈寒26 分钟前
Redis内存警告竟是因为这个不起眼的配置项
前端·人工智能·后端
Python私教33 分钟前
AI 漫剧角色一进分镜就变脸?把提示词升级成“角色 ID + 镜头合同”
后端
Python私教34 分钟前
一次生成 20 个角色却全都撞脸:我用“角色合同”重做了批量生成流程
后端
10mAh1 小时前
【Java】HashMap 的 put 到底做了什么?——冲突、扩容与树化实测
java·开发语言·hash
我命由我123451 小时前
人脸识别 - 勒克斯(光线照射到物体表面上的明亮程度)
android·java·学习·java-ee·人脸识别·学习方法·android runtime
用户594404103561 小时前
Go 语言高性能 Web 服务开发:基于 Gin + GORM + Redis 构建 RESTful API
后端
Python私教1 小时前
App 第一版该砍什么?用三问法守住 MVP 的工程底线
后端·mvp
ServBay2 小时前
AI 工程师必备的 9 个 Python 库,从数据验证到模型优化
后端·python·ai编程
Python私教2 小时前
软件开发报价差 3 倍,真正的工程冲突不在价格
后端·架构