Spring中的循环依赖问题 详细分析

一、什么是循环依赖

简而言之,循环依赖就是A对象的创建依赖了B对象,且B对象的创建也依赖A对象。 循环依赖分为两种,分别是“构造器中的循环依赖”和“属性中的循环依赖”,而“构造器中的循环依赖”是无法解决的,Spring中解决的是“属性中的循环依赖”,下面我们分别说说这两种循环依赖。

二、构造器中的循环依赖

如下代码:加载A类的时候,发现构造方法中需要参数类型B,于是去加载B类,却发现B类的构造器需要加载A类。这时候Spring中就会报错The dependencies of some of the beans in the application context form a cycle,说明构造器中的循环依赖是无法解决的。

@Component
public class A {

    public A(B b){
        System.out.println("A初始化。");
    }

}
@Component
public class B {

    public B(A a){
        System.out.println("B初始化。");
    }

}

三、属性中的循环依赖

什么是“属性中的循环依赖”,我们先来看看没有引入Spring的Java代码: 以下三段代码,当执行Test类中main方法时,会创建A类的对象,但是发现创建A类的对象时需要给属性b创建一个B的对象,于是去创建B类的对象,发现也需要给属性b创建一个A类的对象。如此循环下去,编译器就会报错Exception in thread "main" java.lang.StackOverflowError(堆栈溢出)

public class A {
    // 属性B
    public B b = new B();
}
public class B {
    // 属性A
    public A a = new A();
}
public class Test {
    public static void main(String[] args) {
        A  a = new A();
    }
}

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

在我们的项目中经常有如下代码,使用注解给属性自动注入对象。很显然,虽然是使用注解给属性自动注入,但是也是存在循环依赖的问题,Spring中是如何解决循环依赖问题的呢,这时我们就要从Spring中Bean创建的步骤bean的生命周期两个问题出发:

@Component
public class A {
    @Autowired
    B b;
}
@Component
public class B {
    @Autowired
    A a;
}

spring将Bean的创建分为“对象实例化”和“对象初始化”两个阶段,并利用三级缓存来存储不同阶段的Bean,巧妙的在创建过程中将对象解耦,具体步骤如下:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值