spring的ioc为什么用三级缓存?

(bean的步骤: 1、创建bean  2、填充属性   3、初始化bean)
    1、一级缓存,是必须的,缓存生成好的bean

    2、如果有循环依赖,需要提前暴露 bean引用,存在哪呢?
       不能存在一级缓存,因为一级缓存的定义就是,拿到就能用的,这种半成品存到一级缓存,就不合适
       所以,再弄个别的缓存存着。

    3、于是弄个 二级缓存,暴露bean的引用,这在没有代理的情况下,返回的是原生bean引用,是没有问题的。

    4、在有代理的情况下,获取暴露的bean,需要返回代理类,这里就有问题了,因为每次生成的代理类不唯一。
     假如 a依赖 b、c , 同时b、c也依赖a,那么就必须保证 b、c拿到的代理类是同一个bean。

    5、那就最开始判断如果有代理,那就直接生成代理类,放到二级缓存,其它依赖再需要就直接到缓存拿


    6、到目前为止,用二级缓存在功能上,是没有问题的,
     但是,在代码流程和对象分类上,有点不得劲。
      1、分类: 刚创建的bean(暴露)  ,循环依赖(创建出来的bean,可能是代理类) ,属性填充、实例化后的bean
      2、流程上应该先创建普通类,填充属性,再创建代理类 ,所以是把 beanFactory的回调 在依赖的时候触发(相对延迟),而不是直接创建代理类,再填充属性。

总结:使用缓存是必须的,提升性能, 使用三级缓存是要解决循环依赖,能不能用两级? 也可以实现。
      写代码永远是跟当时的情况相关,可能写了一波代码,然后就要在原来的基础上实现,并尽量优雅,可扩展。
      不用太纠结一定要几层几层的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值