谈谈你对循环依赖的理解?

谈谈你对循环依赖的理解?

什么事循环依赖?A依赖B,B依赖A。

spring中bean对象的创建都要经历实例化和初始化(属性填充)的过程,通过将对象的状态分开,存在成品和半成品的对象的方式,来分别进行初始化和实例化,成本和半成品在存储的时候需要分不同的缓存来进行存储。

1、只有一级缓存行不行?
不行。 会把成品状态的bean对象和半成品状态的bean对象放到一起,而半成品的对象是无法暴露给外部使用的,所以要将成品和半成品区分开,一级缓存中存放成品对象,二级缓存中存放半成品对象。

2、只有二级缓存行不行?
如果整个应用程序中不涉及aop的存在,那么二级缓存中足以解决循环依赖的问题,如果aop中存在了循环依赖,那么就必须要使用三级缓存才能解决。

3、为什么需要三级缓存?
三级缓存的value类型是ObjectFactory,是一个函数式接口,不是直接进行调用的,只有在调用getObject方法的时候才会去调用里面存储的lambda表达式,存在的意义就是为了保证在整个容器的运行过程中同名的bean对象只能有一个。

如果一个对象被代理,或者说需要生成代理对象,那么要不要先生成一个原始对象?
要。

当创建出代理对象之后,会同时存在代理对象和普通对象,那么此时我该用哪一个?
不会同时存在两个相同的对象,也就是说,当需要代理对象的时候,或者说代理对象生成的时候必须要覆盖原始对象,也就是说,整个容器中有且仅有一个bean对象。
在实际调用的过程中,是没有办法来确定什么时候对象需要被调用的,因此当某一个对象被调用的时候,优先判断当前对象是否需要被代理,类似于回调机制,当获取对象之后根据传入的lambda表达式来确定返回的是哪一个确定的对象,如果条件符合,返回代理对象,如果不符合,返回原始对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值