谈谈为什么三重缓存是必要的

首先我们三重缓存应该是逻辑上的三重而不是物理上的三重。比如说其实我们可以只使用一个map就可以实现三重缓存,而不用使用三个map。

首先,第一层缓存是必须存在的,因为它用来存放bean对象。

那么第二层缓存呢。

第二层缓存叫earlySingletonObjects,是用来存放早期对象的。早期对象也就是半成品对象,spring利用半成品对象来提前暴露对象,从而解决循环依赖问题。具体可以看上一篇博客。

那第三层缓存呢

在解决循环依赖的过程中三重缓存的作用是存放一个lamda表达式,这个表达式的作用是把半成品bean放入二层缓存。那么我们为什么不直接把半成品bean放入第二层缓存,而是要新建一个三层缓存呢。

其实是为了解决代理对象的问题。

这里做了一个判断,判断是否实现了后置处理器,如果实现了就加工bean 

它有一个实现类叫autoProxy,自动代理,可以自动创建代理对象。

去掉三层缓存的话,spring的bean就只能存放普通bean而不能存放代理bean了。

至于为什么需要使用lamda表达式。是利用了lamda表达式延迟实现的特性。只有当你开始属性注入时,你才能知道这个bean是不是需要代理。而lamda表达式刚好是调用了采取创建bean。而不是提前把bean放入缓存。

所以不改变执行顺序的前提下三层缓存不能缺少,但是如果改变逻辑,没创建一个早期对象就创建一个代理对象就可以省去一层缓存,但得不偿失,没有必要

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值