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的属性b,b是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的属性a,a是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的属性b,b是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的属性a,a是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
二级:实例化待初始化的对象
三级:对象工厂类,提供对象代理功能