SpringBoot自动装箱原理

✅ 一、Spring Boot 自动装配原理(完整版)

🔍 背后到底发生了什么?

1. @SpringBootApplication 的作用


@SpringBootApplication = @Configuration + @EnableAutoConfiguration + @ComponentScan

  • @EnableAutoConfiguration:核心,开启 Spring Boot 自动装配能力

  • @ComponentScan:自动扫描项目所在包下的 Bean(默认包结构下才生效)

  • @Configuration:声明当前类为配置类


2. 自动装配核心流程图解拆解:
步骤机制实现类
1启动类上 @EnableAutoConfiguration声明了自动配置入口
2导入 AutoConfigurationImportSelector@Import 注入了该选择器
3selectImports() 方法执行加载所有自动配置类
4META-INF/spring.factories 中读取key 为 EnableAutoConfiguration 的配置类全限定名
5判断是否注入(@ConditionalOnXxx比如 @ConditionalOnClass, @ConditionalOnMissingBean
6满足条件 → 自动注入相关 Bean自动创建 RedisTemplate、DataSource、RabbitMQ 等

📂 例子:

# spring-boot-autoconfigure.jar 中的配置:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration


💬 面试模板答法(口语化表达):

Spring Boot 的自动装配依赖于 @EnableAutoConfiguration,它内部通过 AutoConfigurationImportSelector 动态加载所有在 spring.factories 文件中配置的自动配置类。这些自动配置类内部又通过一系列 @ConditionalXxx 注解判断是否需要注入 Bean。比如你引入了 Redis Starter,它就会自动帮你配置 RedisTemplate,前提是你没有自定义这个 Bean。


✅ 二、Spring 三级缓存机制(用于解决循环依赖)

❓ 为什么需要三级缓存?

为了解决 Bean A 和 Bean B 相互依赖(循环依赖)的问题。Spring 通过分步骤暴露 Bean,确保依赖注入完成。


🧠 缓存结构解析(类:DefaultSingletonBeanRegistry)

缓存级别对应 Map含义
一级缓存singletonObjects完整创建好的单例对象
二级缓存earlySingletonObjects提前暴露的对象,避免循环依赖
三级缓存singletonFactories创建代理对象的工厂(ObjectFactory


🔄 详细执行过程:

假设有两个 Bean:A → B → A

  1. Spring 开始创建 A → 将 A 的构造方法生成的 ObjectFactory 放入三级缓存

  2. A 还未注入属性,这时 A 被标记为“创建中”

  3. Spring 发现 A 依赖 B → 开始创建 B

  4. B 发现又依赖 A → 从三级缓存提取 A 的 ObjectFactory → 得到早期 A 实例(可能是代理对象)→ B 顺利完成注入

  5. 回到 A → 继续完成属性注入和初始化 → 放入一级缓存

  6. 移除二级缓存与三级缓存的相关引用


🚫 哪些情况不能解决循环依赖?

依赖方式是否支持说明
构造器注入因为对象未创建,无法提前暴露引用
@Autowired / setter对象可提前暴露引用
多例模式(prototype)Spring 不管理完整生命周期


💬 面试模板答法:

Spring 为了解决单例 Bean 的循环依赖问题,引入了三级缓存机制。Bean 创建过程中,Spring 会先将 ObjectFactory 放入三级缓存,如果后续发现依赖项需要提前使用这个 Bean,就通过三级缓存提前暴露一个半成品引用(可能是代理),避免死循环。创建完成后,Bean 会转移至一级缓存。


🧩 拓展知识点建议(面试常问):

拓展点面试问题回答技巧
Spring Boot 自动装配排查问题如果配置类不生效怎么办?检查 spring.factories@Conditional 是否匹配当前环境
三级缓存源码入口是哪个类处理的缓存机制?DefaultSingletonBeanRegistry 是三级缓存的具体实现类
禁止自动配置如何排除某个自动配置类?使用 @SpringBootApplication(exclude = {RedisAutoConfiguration.class})
循环依赖调试如何模拟和测试?使用 @Autowired 注入两个互相依赖的 Bean 并打印创建过程


🗂️ 总结记忆模板表格(可打印)

模块内容类/注解用途
自动装配机制@SpringBootApplication = 三合一@EnableAutoConfiguration启动自动配置
配置加载来源spring.factoriesAutoConfigurationImportSelector加载所有自动配置类
条件判断装配@ConditionalOnXxxRedisAutoConfiguration、WebMvcAutoConfiguration 等按需注入 Bean
三级缓存机制singletonObjects / earlySingletonObjects / singletonFactoriesDefaultSingletonBeanRegistry解决循环依赖


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值