Spring怎么解决循环依赖问题?

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

1.什么是循环依赖?

循环依赖是指一个或多个对象之间存在直接或间接的依赖关系,这种依赖关系构成一个环形调用 , 举个例子 : A 依赖B , B依赖C , C依赖A , 这样就形成了循环依赖;

Spring怎么解决循环依赖问题?

 

2.spring对循环依赖的处理有三种情况:

①构造器的循环依赖:这种依赖spring是处理不了的,直接拋出BeanCurrentlyInCreationException异常。
②单例模式下的setter循环依赖:通过"三级缓存”处理循环依赖。
③非单例循环依赖:无法处理。

三级缓存的执行逻辑

  • 先从“第一级缓存”找对象,有就返回,没有就找“二级缓存”
  • 找“二级缓存”,有就返回,没有就找“三级缓存”
  • 找“三级缓存”,找到了,就获取对象,放到“二级缓存”,从“三级缓存”移除

3.下面分析单例模式下的setter循环依赖如何解决

Spring的单例对象的初始化主要分为三步:

Spring怎么解决循环依赖问题?

(1)createBeanInstance:实例化,其实也就是调用对象的构造方法实例化对象

(2)populateBean:填充属性,这一步主要是多bean的依赖属性进行填充

(3)initializeBean:调用spring xml中的init 方法.

从上面讲述的单例bean初始化步骤我们可以知道,循环依赖主要发生在第一,第二部.也就是构造器循 环依赖和field循环依赖.

Spring怎么解决循环依赖问题?

 举例:A的某个field或者setter依赖了B的实例对象,同时B的某个field或者setter依赖了A的实例对象”这种循环依赖的情况.

A首先完成了 初始化的第一步(createBeanINstance实例化),并且将自己提前曝光到singletonFactories中.

此时进行初始化的第二步,发现自己依赖对象B,此时就尝试去get(B),发现B还没有被create,所以走 create流程,B在初始化第一步的时候发现自己依赖了对象A,于是尝试get(A),尝试一级缓存 singletonObjects(肯定没有,因为A还没初始化完全),尝试二级缓存earlySingletonObjects(也没 有),尝试三级缓存singletonFactories,由于A通过ObjectFactory将自己提前曝光了,所以B能够通过 ObjectFactory.getObject拿到A对象(虽然A还没有初始化完全,但是总比没有好呀),B拿到A对象后顺利 完成了初始化阶段1,2,3,完全初始化之后将自己放入到一级缓存singletonObjects中.

此时返回A中,A此时能拿到B的对象顺利完成自己的初始化阶段2,3,最终A也完成了初始化,进去了 一级缓存singletonObjects中,而且更加幸运的是,由于B拿到了A的对象引用,所以B现在hold住的A对 象完成了初始化.文章来源地址https://www.toymoban.com/news/detail-712301.html

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

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

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

相关文章

  • Spring如何解决循环依赖问题

    循环依赖问题在Spring中主要有三种情况: (1)通过构造方法进行依赖注入时产生的循环依赖问题。 (2)通过setter方法进行依赖注入且是在多例(原型)模式下产生的循环依赖问题。 (3)通过setter方法进行依赖注入且是在单例模式下产生的循环依赖问题。 在Spring中,只有第

    2024年02月06日
    浏览(32)
  • Spring 是如何解决循环依赖问题的?

    提示:这里简述项目相关背景: 例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大)         我们都知道,如果在代码中,将 两个或多个 Bean 互相之间持有对方的引用 就会发生循环依赖。循环的依赖将会导致注入死循环,这

    2024年02月13日
    浏览(26)
  • 详细解释一下Spring是如何解决循环依赖问题的

    我们都知道,如果在代码中,将 两个或多个Bean互相之间持有对方的引用就会发生循环依赖。循环的依赖将会导致注入死循环 ,这是Spring发生循环依赖的原因 1. 互相依赖: A依赖B , B依赖A , 他们之间形成了循环依赖 2. 间接依赖: A依赖B ,B依赖C , C又依赖A,形成了循环依

    2024年02月09日
    浏览(27)
  • Spring 为什么要用三级缓存来解决循环依赖(AOP),二级缓存不行吗

    解决有代理对象的循环依赖不一定要三级缓存,用二级甚至一级也能解决,下面讨论下Spring为什么选择三级缓存这个方案。 Spring最开始是没有三级缓存的,后面版本因为引入了AOP,有了代理对象,又因为存在循环依赖,为了保证依赖注入过程注入的是代理对象,且不完全打破

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

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

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

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

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

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

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

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

    2024年02月16日
    浏览(28)
  • spring解决循环依赖的三级缓存

    实例化,对应方法:AbstractAutowireCapableBeanFactory中的createBeanInstance方法,简单理解就是new了一个对象。 属性注入,对应方法:AbstractAutowireCapableBeanFactory的populateBean方法,为实例化中new出来的对象填充属性和注入依赖。 初始化,对应方法:AbstractAutowireCapableBeanFactory的initialize

    2024年02月03日
    浏览(30)
  • [Spring] 三级缓存解决循环依赖详解

    注册一个bean对象的过程: Spring扫描class得到BeanDefinition – 根据得到的BeanDefinition去生成bean – 现根据class推断构造方法 – 根据推断出来的构造方法,反射,得到一个对象 – 填充初始对象中的属性(依赖注入) – 如果原始对象种的某个方法被AOP了,那么要根据原始对象生成一

    2024年02月15日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包