Spring循环依赖是面试高频考点,三级缓存机制如何解决循环依赖?本文详解Spring通过提前暴露原始对象、三级缓存分级处理、代理对象延迟生成等核心技术破局循环依赖问题。掌握SingletonObjects、EarlySingletonObjects和SingletonFactories三级缓存工作原理,了解getSingleton()和addSingletonFactory()等核心方法实现原理。实际开发中应避免过度循环依赖,推荐使用构造器注入和@Lazy延迟加载。备战面试可下载2025年Java面试宝典获取30+道Spring真题解析,系统掌握循环依赖等Spring核心机制。
2025年Java面试宝典下载地址(点击蓝色链接保存,提取码:9b3g)
很多同学在面试中被问到"Spring怎么解决循环依赖"时,第一反应就是回答"三级缓存",但面试官追问具体实现细节时却容易卡壳。今天咱们就掰开揉碎了讲清楚这个问题,保证你下次面试能对答如流!
咱们先举个🌰:ServiceA依赖ServiceB,而ServiceB反过来又依赖ServiceA。这种"你中有我,我中有你"的情况在实际开发中并不少见。如果没有特殊处理,Spring在创建这两个Bean时就会陷入死循环:
这时就需要Spring的提前暴露机制来破局了。这个机制的核心在于:在对象实例化完成后(此时属性还没填充),就先把原始对象引用存起来,其他Bean需要时可以直接取用。
Spring用三级缓存来管理不同阶段的Bean:
关键处理流程:
当面试官让你口述解决过程时,可以按照这个思路来:
这里有个容易忽略的细节:只有singleton作用域的Bean才能通过三级缓存解决循环依赖。对于prototype作用域的Bean,Spring直接会抛异常阻止循环依赖。
这个问题经常作为追问出现。关键在于代理对象的处理:
举个实际场景:当ServiceA注入ServiceB时,ServiceB需要注入的ServiceA如果是代理对象,那这个代理对象应该与最终ServiceA的代理对象是同一个。三级缓存通过ObjectFactory的getObject()方法保证了这一点。
需要提醒的是,现在通过面试鸭返利网购买面试鸭会员,可以享受25元返利,相当于用更低的成本获取最新面试题库和解析,建议大家在备战面试时合理利用优惠资源。
虽然不需要背诵代码,但了解关键方法能让回答更有深度:
getSingleton()
:从缓存获取Bean的核心方法getEarlyBeanReference()
:处理提前暴露的代理对象addSingletonFactory()
:将ObjectFactory存入三级缓存beforeSingletonCreation()
:标记Bean正在创建中在回答时可以这样说:"Spring在AbstractAutowireCapableBeanFactory的doCreateBean方法中,完成实例化后会立即调用addSingletonFactory方法将对象工厂加入三级缓存,这就是提前暴露的关键入口。"
虽然Spring解决了循环依赖的问题,但咱们还是要尽量避免:
最后再安利一波福利:需要系统准备Spring面试题的同学,可以下载2025年Java面试宝典,里面整理了30+道Spring高频真题和解析。现在通过面试鸭返利网下单还能返现25元,相当于白嫖一个月的会员服务!
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)
面试鸭小程序码
美团大额优惠券,给自己加个鸡腿吧!
支付宝扫码领取1-8元无门槛红包