Spring循环依赖

Spring是如何实现依赖注入的,又是如何解决解决循环依赖的??

  • 你看下这篇博客吧, 应该有用👉 :spring 解决循环依赖
  • 除此之外, 这篇博客: what?spring已经解决循环依赖了,为啥还报循环依赖错误?中的 一、什么是循环依赖? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在探索哪些场景会报错之前,让我们先来回顾一下,到底什么是循环依赖

    spring 字段注入,相互持有对方引用,造成循环依赖的典型场景

    @Service
     class A {
    
        @Resource
        private B b;
        
    }
    
    @Service
     class B {
     
        @Resource
        private A a;
        
    }
    

    有的小伙伴们开始想了,这种关系我直接用代码表示出来很简单呀,直接new出来,然后设置一下值就好了,为什么用spring的方式就出现循环依赖问题了。

    java代码解决方案如下

    A a = new A();
    B b = new B();
    //依次注入对方
    a.setB(b);
    b.setA(a);
    

    对比发现,很容易得出以下结论:spring在ioc进程中,对象的生成需要流转复杂的bean生命周期,这才导致对象互相引用的时候产生了循环依赖问题。

    问题又来了

    那什么是bean的生命周期

    bean的生命周期,由主线扩展点构成。

    在这里插入图片描述

    本文章只需了解主线流程即可,其中主线为红色,扩展点为蓝色。每个bean对象的生成,都遵循以上过程。

    那么,问题显而易见,bean A创建的时候走到空对象填充值节点时发现需要填充bean B,进而去创建bean Bbean B创建的时候走到空对象填充值节点时发现需要填充bean A,进而去创建bean A,好家伙,进入死循环了。这就是循坏依赖