Spring源码学习:setter循环依赖

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

1.案例

@Component
public class A {
    private B b;

    @Autowired
    public void setB(B b) {
        this.b = b;
    }

    public B getB() {
        return b;
    }

    public void f(){
        System.out.println(b);
    }
}
@Component
public class B {
    private A a;

    @Autowired
    public void setA(A a) {
        this.a = a;
    }
    public void f(){
        System.out.println(a);
    }
}
public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        A a = ctx.getBean(A.class);
        a.f();
        System.out.println(a.getClass());
        System.out.println(a.getB().getClass());
    }
}

2.源码

1.1.在三级缓存中查找a(没找到

1.2.未找到开始创建a的Bean实例

1.2.2.将实例对象包装为WrappedInstance

1.2.3.将该实例添加到第三级缓存中

1.2.4.开始初始化a实例的所有属性

1.2.4.1.开始初始化a的属性bb是setter循环依赖属性

1.2.4.2.在三级缓存中查找b

1.2.4.3.未找到开始创建b的Bean实例

1.2.4.4.通过反射对B类实例化

1.2.4.5.将实例对象包装为WrappedInstance

1.2.4.6.将该实例添加到第三级缓存中

1.2.4.7.开始初始化b实例的所有属性

1.2.4.7.1.开始初始化b的属性aa是setter循环依赖属性

1.2.4.7.2.在三级缓存中查找a

1.2.4.7.3.在第三级缓存中找到获取a的实例

重复1.1.的工作

1.2.4.7.4.将a实例从第三级缓存降到第二级缓存

1.2.4.7.5.初始化b实例的所有属性结束b的Bean创建完成

1.2.4.7.6.将b添加到第一级缓存并从后两级中移除

1.2.4.8.初始化a实例的所有属性结束a的Bean创建完成

1.2.4.9.将a添加到第一级缓存并从后两级中移除

3.流程总结

1.开始实例化a

1.1.在三级缓存中查找a

1.2.未找到开始创建a的Bean实例

1.2.1.通过反射对A类实例化

1.2.2.将实例对象包装为WrappedInstance

1.2.3.将该实例添加到第三级缓存中

1.2.4.开始初始化a实例的所有属性

1.2.4.1.开始初始化a的属性bb是setter循环依赖属性

1.2.4.2.在三级缓存中查找b

1.2.4.3.未找到开始创建b的Bean实例

1.2.4.4.通过反射对B类实例化

1.2.4.5.将实例对象包装为WrappedInstance

1.2.4.6.将该实例添加到第三级缓存中

1.2.4.7.开始初始化b实例的所有属性

1.2.4.7.1.开始初始化b的属性aa是setter循环依赖属性

1.2.4.7.2.在三级缓存中查找a

1.2.4.7.3.在第三级缓存中找到获取a的实例

1.2.4.7.4.将a实例从第三级缓存降到第二级缓存

1.2.4.7.5.初始化b实例的所有属性结束b的Bean创建完成

1.2.4.7.6.将b添加到第一级缓存并从后两级中移除

1.2.4.8.初始化a实例的所有属性结束a的Bean创建完成

1.2.4.9.将a添加到第一级缓存并从后两级中移除

4.三级缓存机制

一级初始化完成的Bean

二级实例化待初始化的对象

三级对象工厂类提供对象代理功能

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring