Spring如何解决循环依赖

其实这个问题真的不难,不知道为什么面试这么喜欢问,要回答这个问题只要掌握两点知识,

  1. 对象创建过程;
  2. Spring中Bean的生命周期

1、循环依赖的产生

A依赖B,B也依赖于A

public class A{
    private A a;

    public void setA(A a){
        this.a = a;
    }

    public A getA(){
        return this.a;
    }
}

public class B{
    private B b;

    public void setA(B b){
        this.b = b;
    }

    public B getB(){
        return this.b;
    }
}

2、Spring是如何解决的循环依赖问题

2.1 Bean的生命周期

Bean的生命周期

2.2 依赖注入的过程

核心是利用了setter方法的注入方式解决的循环依赖,使用构造方法注入是无法解决依赖注入的问题。

1. 通过反射调用A的无参构造方法,创建一个A对象;
2. 调用setter注入B,B b = factory.getBean(B.class),此时会触发B的bean初始化,
    2.1 反射创建B对象
    2.2 调用B的setter方法,获取A对象,A a = factory.getBean(A.class),
    2.3 发现A的bean(此时只是一个空对象,还未填充属性)已存在,把Aset到B对象中
    2.4 B对象接着执行后续的逻辑,BeanPostProcessor前置处理——>初始化——>BeanPostProcessor后置处理等
    2.5 处理玩以后返回B的bean给A
3. A拿到B的Bean后接着setter,然后继续执行后续逻辑,和上面B的过程一样

总的来说Spring就是用反射创建一个初始对象,然后在调用setter方法注入属性的方式解决的循环依赖,使用构造方法注入属性是解决不了循环依赖的问题的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值