Spring解决循环依赖

本文详细阐述了Spring框架如何通过三级缓存机制解决构造器和属性依赖的循环问题,涉及getSingleton(), addSingletonFactory(), 和 addSingleton() 方法的源码剖析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是循环依赖

简单的说就是A依赖B,B依赖C,C依赖A这样就构成了循环依赖。

循环依赖分为构造器依赖和属性依赖,众所周知的是Spring能够解决属性的循环依赖(set注入)。下文将从源码角度分析Spring是如何解决属性的循环依赖。

思路

解决循环依赖,Spring主要的思路就是依据三级缓存,在实例化对象时调用doGetBean,发现A依赖的B的实例,此时调用doGetBean去实例B,实例化的B的时候发现又依赖A,如果不解决这个循环依赖的话此时的doGetBean将会无限循环下去,会导致内存溢出。

三级缓存

Spring能够轻松的解决属性的循环依赖正式用到了三级缓存,在AbstractBeanFactory的父类中DefaultSingletonBeanRegistry有详细的注释。

一级缓存:singletonObjects,存放完全实例化属性赋值完成的Bean,直接可以使用。

二级缓存:earlySingletonObjects,存放早期Bean的引用,尚未属性装配的Bean

三级缓存:singletonFactories,三级缓存,存放实例化完成的Bean工厂。

具体实现

【1】 getSingleton(beanName):源码如下:

从源码可以得知,doGetBean最初是查询缓存,一二三级缓存全部查询,如果三级缓存存在则将Bean早期引用存放在二级缓存中并移除三级缓存。(升级为二级缓存)

【2】addSingletonFactory:源码如下

从源码得知,Bean在实例化完成之后会直接将未装配的Bean工厂存放在三级缓存中,并且移除二级缓存

【3】addSingleton:源码如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值