Spring 三级缓存解决循环依赖

     spring三级缓存解决循环依赖,网上有很多的资料,都是根据源码进行分析,并且写的很详细,这里有一个我认为写的比较好的文章,可以看一下比较官方的解释,如下连接:Spring三级缓存解决循环依赖_胡尚的博客-CSDN博客_spring三级缓存如何解决循环依赖

下面我说一下我自己对三级依赖的理解:

       一层缓存,是存放的正儿八经的已经实例化好的对象。也是单例对象。正常情况下,spring会把初始化好的对象一key、value的形式,存放到map当中。方便其他的service来找的时候,能够通过bean的名字快速找到。

        一层可以理解为,我这是正儿八经的已经是初始化号的对象。想用的话,来我这取。我这没有,说明你要的这个对象在创建中,可能遇到循环依赖了。你去第二层里面看看。

       二层缓存,则存放的是原始的对象,就是new 之后的原始的兑现。对象里面的属性可能还没赋值。就以键值对的形式,存放到第二层缓存的map当中去了。第二层使用了地址引用,就是我先创建好对象,里面的属性还没有呢。你要是想用呢,先把我这个对象的地址拿过去。等你们初始化好了,我在初始化我的对象。我家在这呢,你记住我家的地址了,就能找到我了。先把我的地址付给你的对象属性。用的时候,我已经初始化好了,到时候里面的属性都能用了。

      二层理解为创建中的对象。只要没走完初始化,bean对象都会存里面。一层找不到,就去二层找,二层找到是以后一层要用的对象地址了。对象不完美,但是有地址就够了,初始化完,完美的对象也是那个地址,通过地址就可以用正式的对象了。

   三层就有点意思了。上面的两层已经可以满足循环依赖了。但是针对aop的就不太友好了。aop是在初始化好的bean对象外面包裹一层代理类。然后实现aop的逻辑。代理类可不走单例。只是代理里面的初始化好的对象走单例。如果一个serviceA里面的serviceB/serviceC都有serviceA的对象的话,并且A是走的AOP,那么会导致serviceC/serviceB 两个各自创建一个serviceA为核心的代理对象。这不符合spring的设计理念。所以,就上了三级缓存。

    三级缓存用了一个lambda表达式。放到三层缓存里面。 而不是上来就创建。只有真正用到的时候才会创建,这块还不理解为什么,可能是为了节省资源吧,个人理解。 当真的有serviceB/serviceC 出现共同属性serviceA的时候,并且走了aop。 那么就会调用lambda创建一个对象。并且放回到一级缓存当中。说明对象已经创建好了,可以用了。这个时候,为了防止重复创建,三级缓存会把对应的对象从三级缓存删掉。这样,当有第二个对象找同样的对象的时候,要不在一级缓存里面找到,要不,跳到三级里面发现为空,报错抛出了。

   三级缓存我感觉主要是针对aop的。如果设计套循环依赖,则会导致aop初始化提前。具体可以看上面的文章,介绍的很详细。 建议和aop 相关资料一起看。

总结一下:

    一级缓存是存放已经初始化好的,可以用的对象。

     二级缓存,存放是创建中的对象。

    三级缓存,则主要针对带有aop的对象的处理。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值