老生谈spring(十九):循环依赖(一)
1、本篇开始就进入bean的创建过程,但是这个过程是非常复杂的。而这个过程里面最为经典的莫过于循环依赖,所以循环依赖我会细分为几个篇章去详细讲解。
2、spring是否支持循环依赖,我们举个例子来证明一下。定义两个类A和B,让这两个类互相注入。(循环依赖)
@Component
public class A {
@Autowired
private B b;
public B getB() {
return b;
}
}
@Component
public class B {
@Autowired
private A a;
public A getA() {
return a;
}
}
3、在启动类上获取这两个bean,然后判断注入的bean和取出来的bean是否同一个对象。
public class XmlApplication {
public static void main(String[] args) throws Exception {
//通过指定xml加载上下文
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
//启动容器
context.refresh();
//从容器中获取bean
A a = context.getBean(A.class);
B b = context.getBean(B.class);
System.out.println(a == b.getA());
System.out.println(b == a.getB());
}
}
4、结果为true,说明spring默认是支持循环依赖的。(可以改成不支持)
5、当我们通过context设置allowCircularReferences为false时,spring则不支持循环依赖。
6、结语:本节简单展示spring的循环依赖以及如何让spring不支持循环依赖,后面的章节会着重于从源码的角度分析为什么spring可以支持循环依赖。