Spring Bean循环依赖是面试高频考点,Spring通过三级缓存机制解决单例Bean的循环依赖问题。第一级缓存存放完整Bean,第二级缓存存放半成品Bean,第三级缓存存放对象工厂。当BeanA依赖BeanB时,Spring会先将BeanA的半成品放入二级缓存,BeanB创建时就能获取到BeanA的引用。注意构造器注入无法解决循环依赖,建议使用setter注入或@Lazy延迟加载。生产环境中要避免多例Bean和AOP代理导致的循环依赖问题。掌握这些核心原理能帮助开发者优化Spring应用架构,提升系统稳定性。
(这张图展示了Spring容器中Bean的创建流程,咱们后面会具体解释)
2025年Java面试宝典已上传网盘:
🔗 点击获取 提取码: 9b3g
作为面试中Spring框架的必考题,循环依赖问题让很多同学头疼。今天咱们就掰开揉碎了讲清楚,Spring到底是怎么解决Bean循环依赖的,以及我们开发中需要注意的坑点。
简单说就是两个Bean互相依赖:BeanA依赖BeanB,BeanB又反过来依赖BeanA。比如订单服务调用用户服务,用户服务又需要查询订单记录,这种情况如果不做特殊处理,Spring容器启动时就会抛出BeanCurrentlyInCreationException
。
Spring通过三级缓存打破循环依赖的死锁,这是面试官最想听到的核心答案:
(三级缓存的交互流程示意图)
当BeanA开始创建时,Spring会先把它的空对象(未注入属性)放入二级缓存。在给BeanA注入BeanB时,如果发现BeanB还没创建,就会先去创建BeanB,此时BeanB需要注入BeanA时,就能从二级缓存拿到BeanA的半成品对象,从而完成依赖注入。
很多同学不知道的是:通过构造器注入的循环依赖,Spring是处理不了的!这是因为:
这种情况下,解决方案有两种:
allowCircularReferences
(不推荐,容易引发其他问题)在需要延迟加载的Bean上添加@Lazy
注解,可以让Spring先创建代理对象,等到真正调用时才初始化实际对象。这种方式特别适合解决:
(实际项目中典型的循环依赖错误日志)
"Spring通过三级缓存机制解决单例Bean的循环依赖问题。具体来说,在Bean实例化之后会提前暴露对象引用,后续的依赖注入阶段如果发现循环依赖,可以通过早期暴露的对象完成注入。但要注意构造器注入的循环依赖需要特殊处理..."
如果需要购买面试鸭会员,可以通过面试鸭返利网找我返利25元,更多Spring高频真题和实战案例可以查看我们的会员题库。
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)
面试鸭小程序码
美团大额优惠券,给自己加个鸡腿吧!
今日有支付宝大红包赶快领,手慢无
支付宝扫码领取1-8元无门槛红包