源码分析Spring解决循环依赖问题

概览

在这里插入图片描述

测试代码

@Slf4j
@Data
public class A {
  B b;

  public void fun() {
    log.info("A fun");
    b.fun();
  }
}

@Slf4j
@Data
public class B {
  A a;

  public void fun() {
    log.info("B fun");
  }
}

public class Test {
  public static void main(String[] args) {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("META-INF/cycle.reference.xml");
    A a = (A)applicationContext.getBean("a");
    a.fun();
  }
}


resource目录中创建META-INF/cycle.reference.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="a" class="com.example.springbootdemo.test.cycle.reference.A" >
        <property name="b" ref="b"/>
    </bean>

    <bean id="b" class="com.example.springbootdemo.test.cycle.reference.B" >
        <property name="a" ref="a"/>
    </bean>
</beans>


获取 Bean A

获取Bean入口:org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
在这里插入图片描述

创建Bean A

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
把实例A工厂缓存下来(三级缓存):

该对象工厂在后面会被用于返回实例A
在这里插入图片描述

填充实例A的属性

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

递归获取Bean B

在这里插入图片描述

获取Bean B

在这里插入图片描述

创建Bean B

在这里插入图片描述
在这里插入图片描述

填充实例B的属性

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

递归获取Bean A

在这里插入图片描述

再次进入doGetBean(A)

在这里插入图片描述

从缓存中获取实例A

这里用到了加载Bean A时缓存过的对象工厂
在这里插入图片描述

返回半成品实例A

在这里插入图片描述

Bean B 属性填充完成

在这里插入图片描述
Bean B 属性填充完成后,然后初始化,最后返回Bean B

回到实例A的属性填充过程

在这里插入图片描述

实例A的属性B填充成功

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值