详细解释一下Spring是如何解决循环依赖问题的

这篇具有很好参考价值的文章主要介绍了详细解释一下Spring是如何解决循环依赖问题的。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring是如何解决循环依赖问题的?

我们都知道,如果在代码中,将两个或多个Bean互相之间持有对方的引用就会发生循环依赖。循环的依赖将会导致注入死循环,这是Spring发生循环依赖的原因

循环依赖有三种形态

1.互相依赖:
A依赖B , B依赖A , 他们之间形成了循环依赖
详细解释一下Spring是如何解决循环依赖问题的

2.间接依赖:
A依赖B ,B依赖C , C又依赖A,形成了循环依赖
详细解释一下Spring是如何解决循环依赖问题的

3.自我依赖:
A依赖A形成了循环依赖
详细解释一下Spring是如何解决循环依赖问题的

Spring中的三级缓存

Spring中设计了三级缓存来解决循环依赖问题,当我们去调用getBean()方法的时候:
1> Spring会先从一级缓存中去找到目标Bean,如果发现一级缓存中没有便会去二级缓存中去找
2> 如果一、二级缓存中都没有找到,意味着该目标Bean还没有实例化(早期Bean)。于是,Spring容器会实例化目标Bean,然后将目标Bean放入到二级缓存中,同时,加上标记是否存在循环依赖。如果不存在循环依赖便会将目标Bean存入到二级缓存
3> 否则,便会标记该Bean存在循环依赖,然后将等待下一次轮询赋值,也就是解析@Autowired注解。等@Autowird(成熟Bean),会将目标Bean存入到一级缓存

第三级缓存的作用是用来存储代理Bean的,当调用getBean()方法之后,发现目标Bean需要通过代理工程来创建,此时会将创建好的实例保存到三级缓存,最终也会赋值好的Bean同步到一级缓存中

早期Bean:刚初始化的Bean

成熟Bean:完成注入的Bean

在Spring三级缓存的设计下,我画了一张图来描述一下其工作原理:
详细解释一下Spring是如何解决循环依赖问题的

Spring本身只能解决单实例存在的循环依赖问题,存在以下四种情况需要人为干预:
1> 多实例的Setter注入导致的循环依赖,需要把Bean改成单例
2> 构造器注入导致的循环依赖,可以通过@Lazy注解
3> DependsOn导致的循环依赖,找到注解循环依赖的地方,迫使它不循环依赖
4> 单例的代理对象Setter注入导致的循环依赖
① 可以使用Lazy注解
② 或者使用@DependsOn注解指定加载先后关系

在实际开发中,出现循环依赖的根本原因还是在代码设计的时候,因为模块的耦合度较高依赖关系复杂导致的,我们应该尽可能地从系统设计角度去考虑模块之间的依赖关系,避免循环依赖地问题。

三级缓存的核心思想:就是把Bean的实例化和Bean里面的依赖注入进行分离

总结:

① 采用一级缓存存储成熟Bean实例,采用二级缓存来存储早期Bean实例
② 通过早期Bean实例作为突破口,解决循环依赖问题。
③ 至于第三级缓存,主要是解决代理对象的循环依赖问题。文章来源地址https://www.toymoban.com/news/detail-698872.html

到了这里,关于详细解释一下Spring是如何解决循环依赖问题的的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring 是如何解决循环依赖的

    1.什么是循环依赖? 所谓的循环依赖是指,A 依赖 B,B 又依赖 A,它们之间形成了循环依赖。或者是 A 依赖 B,B 依赖 C,C 又依赖 A。它们之间的依赖关系如下: 2.通过手写代码演示理解Spring循环依赖 DEMO: 为什么需要二级缓存? 一级缓存和二级缓存相比: 二级缓存只要是为了分

    2024年02月03日
    浏览(40)
  • 深谈Spring如何解决Bean的循环依赖

    Java循环依赖指的是两个或多个类之间的相互依赖,形成了一个循环的依赖关系,这会导致程序编译失败或运行时出现异常。下面小岳就带大家来详细分析下Java循环依赖。 简单来讲就是:假设有两个人是:A和B, A想要向B借钱,但B需要先向A借钱。 这种情况就形成了循环依赖

    2023年04月17日
    浏览(44)
  • Spring中的循环依赖是什么?如何解决它?

    循环依赖是指两个或多个Bean之间相互依赖,导致它们无法被正确地初始化。在Spring中,当两个或多个Bean之间存在循环依赖时,Spring容器无法决定哪个Bean应该先初始化,因此会抛出BeanCurrentlyInCreationException异常,从而导致应用程序启动失败。   为了解决循环依赖问题,Spr

    2023年04月16日
    浏览(63)
  • spring工程的启动流程?bean的生命周期?提供哪些扩展点?管理事务?解决循环依赖问题的?事务传播行为有哪些?

    Spring工程的启动流程主要包括以下几个步骤: 加载配置文件:Spring会读取配置文件(如XML配置文件或注解配置)来获取应用程序的配置信息。 实例化并初始化IoC容器:Spring会创建并初始化IoC容器,即ApplicationContext。在这一步,Spring会解析配置文件,并将配置的Bean实例化。

    2024年02月12日
    浏览(38)
  • Spring循环依赖那些事儿(含Spring详细流程图)

    背景 1、循环依赖异常信息 应用时间时间久 应用多人同时并行开发 应用保证迭代进度 经常出现启动时出现循环依赖异常   2、依赖关系 先不关注其他不规范问题,看现象 3、涉及基础知识 Spring bean 创建流程 Dynamic Proxy 动态代理 Spring-AOP 原理   问题 注:Spring启动流程与Bean创

    2024年02月05日
    浏览(43)
  • spring 的循环依赖以及spring为什么要用三级缓存解决循环依赖

            bean的生命周期         这里简单过一下 class -无参构造 -普通对象 -依赖注入(对加了autowire等的属性赋值) -初始化前-初始化 -初始化后(aop) -放入单例池的map(一级缓存) -bean对象 这里提一点单例bean单例bean 其实就是用mapbeanName,Bean对象创建的,多例bean就不

    2024年02月15日
    浏览(57)
  • Spring解决循环依赖

    目录 什么是spring循环依赖 什么情况下循环依赖可以被处理? spring 如何解决循环依赖 创建A这个Bean的流程 答疑 疑问:在给B注入的时候为什么要注入一个代理对象? 初始化的时候是对A对象本身进行初始化,而容器中以及注入到B中的都是代理对象,这样不会有问题吗? 三级

    2024年02月22日
    浏览(48)
  • (循环依赖问题)学习spring的第九天

     Bean实例的属性填充  Spring在属性注入时 , 分为如下几种情况 : 注入单向对象引用 : 如usersevice里注入userdao , userdao里没有注入其他属性     注入双向对象引用 : 如usersevice里注入userdao , userdao也注入usersevice属性  (搞清原理即可) 问题提出 : 形成死循环 解决问题 : 三级缓存解决

    2024年01月22日
    浏览(37)
  • 三级缓存---解决 Spring 循环依赖

    首先,什么是循环依赖?这个其实好理解,就是两个 Bean 互相依赖,类似下面这样: \\\"\\\"\\\" \\\"\\\"\\\" AService 和 BService 互相依赖: 一般来说,循环依赖有三种不同的形态,上面就是其中一种。 另外两种分别是三者依赖,如下图: 这种循环依赖一般隐藏比较深,不易发觉。 还有自我依

    2024年02月16日
    浏览(47)
  • Spring 怎么解决循环依赖的呢?

    Spring 循环依赖:简单说就是自己依赖自己,或者和别的 Bean 相互依赖。 只有单例的 Bean 才存在循环依赖的情况, 原型 (Prototype)情况下,Spring 会直接抛出异常。原因很简单,AB 循环依赖,A 实例化的时候,发现依赖 B,创建 B 实例,创建 B 的时候发现需要 A,创建 A1 实例……

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包