主题
面试速答(先看这里)
**一句话结论:**但是, 需要注意的是,在SpringBoot 2.6以前,是默认支持三级缓存解决循环依赖的,但是在 SpringBoot 2.6 开始,默认已经不开启对循环依赖的支持了!
60秒标准回答:
如果一个Bean是正常的Bean,没有缺少必要的注解,也确实在Spring的上下文中的话,无法被初始化,可能考虑的因素是循环依赖的情况
我们知道,Spring其实是解决了循环依赖的,使用的方案是三级缓存,但是并不是所有的情况他都解决了
但是, 需要注意的是,在SpringBoot 2.6以前,是默认支持三级缓存解决循环依赖的,但是在 SpringBoot 2.6 开始,默认已经不开启对循环依赖的支持了!!!
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**如果一个Bean是正常的Bean,没有缺少必要的注解,也确实在Spring的上下文中的话,无法被初始化,可能考虑的因素是循环依赖的情况。
- **要点2:**我们知道,Spring其实是解决了循环依赖的,使用的方案是三级缓存,但是并不是所有的情况他都解决了。
- **要点3:**所有,当出现一个Bean无法被初始化的时候,要考虑下是不是这个原因导致的,具体的解决方案在上面的文章中介绍了,在配置文件中加入 spring.main.allow-circular-references=true 或者用 @Lazy 注解,在 @Autowired 地方增加即可。
- **要点4:**那么,除了以上这种情况外, 如果遇到了非单例的bean,或者是构造器注入也是不行的。
- **要点5:**构造器注入的循环依赖,可以通过以下的手段解决:
**记忆锚点:**Bean → SpringBoot → Spring → bean → Lazy → 1重新设计彻底消除循环依赖
易错提醒:
- 但是, 需要注意的是,在SpringBoot 2.6以前,是默认支持三级缓存解决循环依赖的,但是在 SpringBoot 2.6 开始,默认已经不开启对循环依赖的支持了!
加分表达:
- 如果一个Bean是正常的Bean,没有缺少必要的注解,也确实在Spring的上下文中的话,无法被初始化,可能考虑的因素是循环依赖的情况。
- 那么,除了以上这种情况外, 如果遇到了非单例的bean,或者是构造器注入也是不行的。
- 构造器注入的循环依赖,可以通过以下的手段解决: 1、重新设计,彻底消除循环依赖 循环依赖,一般都是设计不合理导致的,可以从根本上做一些重构,来彻底解决, 2、改成非构造器注入 可以改成setter注入或者字段注入。
追问准备:
- 围绕「Bean」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「SpringBoot」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「Spring」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
如果一个Bean是正常的Bean,没有缺少必要的注解,也确实在Spring的上下文中的话,无法被初始化,可能考虑的因素是循环依赖的情况。
我们知道,Spring其实是解决了循环依赖的,使用的方案是三级缓存,但是并不是所有的情况他都解决了。
但是,需要注意的是,在SpringBoot 2.6以前,是默认支持三级缓存解决循环依赖的,但是在 SpringBoot 2.6 开始,默认已经不开启对循环依赖的支持了!!!
打开文档:✅Spring默认支持循环依赖吗?如果发生如何解决?
所有,当出现一个Bean无法被初始化的时候,要考虑下是不是这个原因导致的,具体的解决方案在上面的文章中介绍了,在配置文件中加入spring.main.allow-circular-references=true或者用@Lazy 注解,在@Autowired 地方增加即可。
那么,除了以上这种情况外,如果遇到了非单例的bean,或者是构造器注入也是不行的。
构造器注入的循环依赖,可以通过以下的手段解决:
1、重新设计,彻底消除循环依赖
循环依赖,一般都是设计不合理导致的,可以从根本上做一些重构,来彻底解决,
2、改成非构造器注入
可以改成setter注入或者字段注入。
3、使用@Lazy解决