@Component
public class A {private B b;@Autowiredpublic 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;@Autowiredpublic 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());}
}
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添加到第一级缓存,并从后两级中移除
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添加到第一级缓存,并从后两级中移除
一级:初始化完成的Bean
二级:实例化待初始化的对象
三级:对象工厂类,提供对象代理功能