gpt4 book ai didi

Java Spring循环依赖原理与bean的生命周期图文案例详解

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 28 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Java Spring循环依赖原理与bean的生命周期图文案例详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

前言

Spring是如何处理循环依赖的,又是怎么做到,互相注入对方的proxy bean而不是raw bean的?现在就分析一下 。

  。

1、循环依赖是什么

Spring中放入两个Service,分别是C1和C2,然后C1和C2又互为对方的成员变量。这种情况C1和C2就可以说是相互循环依赖了 。

  。

2、源码图解

1. bean的主要生命周期图解

Java Spring循环依赖原理与bean的生命周期图文案例详解

上图是一个没有循坏依赖的bean的主要生命周期节点,下图的循坏依赖可以结合该图解一起看 。

2.循环依赖图解

Java Spring循环依赖原理与bean的生命周期图文案例详解

可以看到里面有一个很重要的逻辑:

当一个bean经过所有的步骤之后,会去三个缓存里的二级缓存根据beanName获取对象.

  1. 如果拿不到,就直接使用initializeBean方法之后生成的bean,然后放入到spring容器中
  2. 如果拿得到,就要对比执行initializeBean前后的bean,如果bean相同,就用二级缓存里的对象作为bean放入到spring容器中,否则就报错
  3. 所以spring3个缓存中,二级缓存存在的意义就是判断该bean是否被循环依赖过,只有被循环依赖了,注入到其他bean的属性里了,才会放入到二级缓存。
  4. 然后最后的判断,判断initializeBean方法执行前后对象是否一致,其实就是为了判断被循环依赖的bean在注入到其他bean和自己走完bean生命周期的是不是同一个object,如果不是同一个object,那就有问题,要报错。

Java Spring循环依赖原理与bean的生命周期图文案例详解

可以看到此处第二个参数allEarlyReference,这个参数就是用来区分从3个缓存里取bean的时候是否需要到3级缓存里取对象,此处为false,所以截止到2级为止.

3. 循环依赖处理完成之后

Java Spring循环依赖原理与bean的生命周期图文案例详解

直接从Spring容器里拿的是c1 proxy或者c2 proxy,但是其实在属性注入的时候,都是调用的raw对象的set方法,也就是proxy的target调用的set方法.

  。

总结

循环依赖其实耐下功夫读源码,也没有那么难。下次分享为什么循环依赖的其中一个类添加@Async有可能会导致注入失败而抛异常 。

到此这篇关于Spring循环依赖原理与bean的生命周期图文案例详解的文章就介绍到这了,更多相关Spring循环依赖原理与bean的生命周期内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。

原文链接:https://blog.csdn.net/liangsheng_g/article/details/119712048 。

最后此篇关于Java Spring循环依赖原理与bean的生命周期图文案例详解的文章就讲到这里了,如果你想了解更多关于Java Spring循环依赖原理与bean的生命周期图文案例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com