spring bean的循环依赖

        spring bean的循环依赖问题:通过三级缓存来解决。

一级缓存 用来缓存已经实例化和初始化好的bean,基本上算的上一个完成的bean。

二级缓存用来缓存只实例化好的bean,用于提前暴露bean对象。用于解决循环依赖。

三级缓存用来缓存每个bean的beanfactory工厂,主要用于保证提前暴露出去的bean和最终的bean是否一致,因为在bean初始化的过程中,有可能被aop,就是被代理对象替换了,如果是最终的bean和提前暴露的bean不一致也是有问题的。

为什么要用第三级缓存?只用二级缓存行吗?

答案:部分可行,bean如果被代理的话就不行。在bean生成过程中没有被aop的话,只使用两个缓存确实是可以的。但是当bean被代理后,代理的工厂也是需要缓存的,工厂的代理就放到了第三级缓存中,这样每次从工厂获取bean的时候就能保证是同一个bean,而不是每次都新生成一个bean。

记住一点,所有的单例bean在初始化时,都是首先被放入到第三级缓存中的,如果没有循环依赖,等bean直接初始化好以后,直接从三级到一级。只有当出现循环依赖的时候,bean才会从三级先到二级,也就是说,在二级里面的bean 都是有循环依赖的,是会被先拿出去用的,由于后面还会就行bean的初始化,导致bean有可能被进行aop,也就是进行动态代理,最终产生的bean和最先产生的bean不一致,为了避免这个问题,使用三级缓存。

     spring bean的生命周期

1.实例化:会调用bean的构造方法进行实例化对象,所以spring无法解决构造方法带来的依赖注入。该对象的会提前暴露到二级缓存中,用于解决spring的循环依赖问题。

2.填充属性:注入bean中需要的对象

3.初始化:调用init方法进行bean的初始化,经过这个阶段的以后,bean就成为一个可用的对象。同时放入到一级缓存中

4.使用和卸载:正常使用和销毁。

可以参考连接:

Spring系列第56篇:一文搞懂spring到底为什么要用三级缓存??_路人甲Java的博客-CSDN博客今天来聊一个面试中经常会被问到的问题,咱们一起必须把这个问题搞懂。问题:spring 中为什么需要用三级缓存来解决这个问题?用二级缓存可以么?我先给出答案:不可用。这里先声明下:本文未指明...https://blog.csdn.net/likun557/article/details/113977261?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168595191316782427440346%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168595191316782427440346&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-5-113977261-null-null.142%5Ev88%5Einsert_down28v1,239%5Ev2%5Einsert_chatgpt&utm_term=spring%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E4%B8%89%E7%BA%A7%E7%BC%93%E5%AD%98&spm=1018.2226.3001.4187

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值