模型服务连接失败
Java
分类
分布式系统
难度
未设置
来源数
1
更新时间
2026/03/29 15:43

答案

循环依赖出现的情况主要是,多个bean互相持有而导致的一种循环依赖,如果不经处理,在getBean时,初始化bean A,A中注入bean B,此时会再去初始化bean B,而bean B中也注入了bean A,但bean A还没有初始化完成,这就会导致循环依赖。在Spring中,解决循环依赖主要是靠三级缓存。一级缓存当中主要存放已经初始化完的完整bean实例,也叫成熟对象,二级缓存主要存放的已经实例化但还未初始化的bean对象,三级缓存主要用作单例工厂的缓存。在三级缓存下,我们在实例化A时,会将它的ObjectFactory放入第三级缓存,然后初始化时,发现要注入B,会对B进行实例化,并同样将他的ObjectFactory放入第三级缓存,然后在B中需要注入A,此时会在第三级缓存当中获取到A的ObjectFactory,并调用get方法获得A的实例,并将其放入二级缓存,删除三级缓存。然后B初始化完成,放入第一级缓存,删除二三级缓存,然后A也实例化完成,放入第一级缓存,删除二三。这种方法主要用来解决单例下的循环依赖。

元信息

审核状态: active
关联来源: 1

来源面经题(0)

这道题目前没有手动沉淀的面经题来源。

来源(1)

Java八股(框架).md

knowledge_note
Question 19: IOC 如何解决循环依赖? Source answer: 循环依赖出现的情况主要是,多个bean互相持有而导致的一种循环依赖,如果不经处理,在getBean时,初始化bean A,A中注入bean B,此时会再去初始化bean B,而bean B中也注入了bean A,但bean A还没有初始化完成,这就会导致循环依赖。在Spring中,解决循环依赖主要是靠三级缓存。一级缓存当中主要存放已经初始化完的完整bean实例,也叫成熟对象,二级缓存主要存放的已经实例化但还未初始化的bean对象,三级缓存主要用作单例工厂的缓存。在三级缓存下,我们在实例化A时,会将它的ObjectFactory放入第三级缓存,然后初始化时,发现要注入B,会对B进行实例化,并同样将他的ObjectFactory放入第三级缓存,然后在B中需要注入A,此时会在第三级缓存当中获取到A的ObjectFactory,并调用get方法获得A的实例,并将其放入二级缓存,删除三级缓存。然后B初始化完成,放入第一级缓存,删除二三级缓存,然后A也实例化完成,放入第一级缓存,删除二三。这种方法主要用来解决单例下的循环依赖。 Reviewed answer: Spring 主要通过三级缓存解决单例 Bean 的属性注入循环依赖:一级缓存放完整单例,二级缓存放提前暴露的早期对象,三级缓存放 ObjectFactory,用于必要时生成早期引用。