Java 中如何避免循环引用,解决相互依赖的问题

spring中通过依赖注入的方法来解决类的相互依赖问题!!!

spring中通过依赖注入的方法来解决类的相互依赖问题!!!

spring中通过依赖注入的方法来解决类的相互依赖问题!!!


只要不是构造函数注入就不会产生循环引用的问题。

这是因为:

spring 容器对构造函数配置Bean 进行实例化的时候,有一个前提,即 Bean 构造函数入参引用的对象必须已经准备就绪。

由于这个机制,如果两个Bean 都循环引用,都采用构造函数注入的方式,就会发生类似于线程死锁的循环依赖问题。


代码示例:

public class TestA {

    private TestB b;

    public TestA(){
        b = new TestB();
        System.out.println("init A");
    }

}
public class TestB {

    private TestA a;

    public TestB(){
        a = new TestA();
        System.out.println("testB init");
    }

    public static void main(String[] args) {
        TestA testA = new TestA();
    }
}

运行后日志:

Exception in thread "main" java.lang.StackOverflowError

这中情况会导致堆栈溢出

如果将TestA 稍作如下修改即不会出现报错

public class TestA {

    private TestB b;

    public TestA(){
        System.out.println("init A");
    }
    
    public void setB(TestB b){
        this.b = b;
    }

}

参考:

Spring 依赖注入三种方式的实现,及循环依赖问题的解决(源码+XML配置)

如何解决Java循环依赖的问题

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值