spring如何解决循环依赖问题

 更新时间:2024年10月14日 10:19:24   作者:loveLifeLoveCoding  
Spring在单例模式下用三级缓存设计解决setter方法注入bean属性循环依赖问题,但无法解决多例Bean和构造方法注入参数的循环依赖,三级缓存通过A、B两对象互相注入属性的过程解决循环依赖,其中,构造方法的循环依赖无法解决是因为创建对象会走构造方法

spring解决循环依赖

Spring 中使用了三级缓存的设计,来解决单例模式下的属性循环依赖问题。

解决的只是单例模式下 setter 方法注入bean属性循环依赖问题,

对于多例 Bean 和 构造方法注入 参数的循环依赖问题,并不能使用三级缓存设计解决。

缓存变化过程

  • A实例化后、注入前放到3级缓存
  • A在注入属性时,发现有循环依赖,因此需要先getBean(B),实例化B,并将B也 从入3级缓存
  • B放到3级缓存后,这时B要开始注入属性A,于是B找到了循环依赖A后,再从头执行getBean(A)方 法,getSingleton方法本次从缓存中取,然后将A设置到2级缓存,并且从3级缓存移除。
  • B如愿以偿的拿到了A完成注入,然后B执行到DefaultSingletonBeanRegistry#addSingleton方 法,将B从3级缓存移出,放入1级缓存,到此B完成。B的完成是被动的,A需要它,才会先去创建 它
  • A 还要继续自己的流程,然后populateBean方法将B注入。然后,A移出2级缓存,进入1级缓存, 整个流程完成!

为什么不能解决非单例、构造方法的循环依赖问题

为什么不能解决构造方法的循环依赖?

  • 创建对象会走构造方法,而构造方法的参数是互相依赖的对象
  • 此时都还没有初始化创建完成,因此无法进行实例化创建

为什么不能解决多例的循环依赖?

  • IoC容器只会管理单例Bean,并将单例Bean存入缓存。
  • 作用域为prototype时,每次getBean 都会创建新的对象,并不存入缓存,因此不可以解决循环依赖问题。

解决方法

避免循环依赖:

引入第三个类C, A 和 B 都依赖 C, 而不是相互依赖

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java控制台实现拼图游戏

    java控制台实现拼图游戏

    这篇文章主要为大家详细介绍了java控制台实现拼图游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • java读取wav文件(波形文件)并绘制波形图的方法

    java读取wav文件(波形文件)并绘制波形图的方法

    这篇文章主要介绍了java读取wav文件(波形文件)并绘制波形图的方法,涉及java操作多媒体音频文件转换的相关技巧,需要的朋友可以参考下
    2015-06-06
  • java 生成文字图片的示例代码

    java 生成文字图片的示例代码

    本篇文章主要介绍了java 生成文字图片的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • springboot Interceptor拦截器excludePathPatterns忽略失效

    springboot Interceptor拦截器excludePathPatterns忽略失效

    这篇文章主要介绍了springboot Interceptor拦截器excludePathPatterns忽略失效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • SpringMVC MVC架构与Servlet使用详解

    SpringMVC MVC架构与Servlet使用详解

    MVC设计模式一般指 MVC 框架,M(Model)指数据模型层,V(View)指视图层,C(Controller)指控制层。使用 MVC 的目的是将 M 和 V 的实现代码分离,使同一个程序可以有不同的表现形式。其中,View 的定义比较清晰,就是用户界面
    2022-10-10
  • 一次Jvm old过高的排查过程实战记录

    一次Jvm old过高的排查过程实战记录

    这篇文章主要给大家介绍了一次Jvm old过高的排查过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Java网络编程基础详解

    Java网络编程基础详解

    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。本文介绍了一些网络编程基础的概念,并用Java来实现TCP和UDP的Socket的编程,来让读者更好的了解其原理
    2021-08-08
  • 详解如何将JAVA程序制作成可以直接执行的exe文件

    详解如何将JAVA程序制作成可以直接执行的exe文件

    这篇文章主要介绍了详解如何将JAVA程序制作成可以直接执行的exe文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • JSON复杂数据处理之Json树形结构数据转Java对象并存储到数据库的实现

    JSON复杂数据处理之Json树形结构数据转Java对象并存储到数据库的实现

    这篇文章主要介绍了JSON复杂数据处理之Json树形结构数据转Java对象并存储到数据库的实现的相关资料,需要的朋友可以参考下
    2016-03-03
  • Java字符串编码知识点详解介绍

    Java字符串编码知识点详解介绍

    在本篇内容了小编给大家详细分析了关于Java字符串编码的知识点并对实例做了分析,有兴趣的朋友们跟着学习下。
    2022-11-11

最新评论