目录
一、什么是循环依赖?
例如,就是A对象依赖了B对象,B对象依赖了A对象。
// A依赖了B
class A{
public B b;
}
// B依赖了A
class B{
public A a;
}
如果不考虑Spring,循环依赖并不是问题,因为对象之间相互依赖是很正常的事情。
比如:
A a = new A();
B b = new B();
a.b = b;
b.a = a;
这样,A,B就依赖上了。
但是,在 Spring 中循环依赖就是一个问题了,因为,在 Spring 中,一个对象并不是简单 new 出来了,而是会经过一系列的 Bean 的生命周期,就是因为 Bean 的生命周期所以才会出现循环依赖问题。当然,在 Spring 中,出现循环依赖的场景很多,有的场景 Spring 自动帮我们解决了,而有的场景则需要程序员来解决。
要明白Spring中的循环依赖,得先明白Spring中Bean的生命周期。
二、Bean的生命周期
2.1 Spring Bean 的生命周期
具体看这篇博客–>> Spring Bean 的生命周期
2.2 Bean 的生成步骤
被 Spring 管理的对象叫做 Bean 。Bean的生成步骤如下:
- Spring 扫描 class 得到 BeanDefinition;
- 根据得到的 BeanDefinition 去生成 bean;
- 首先根据 class 推断构造方法;
- 根据推断出来的构造方法,反射,得到一个对象(暂时叫做原始对象);
- 填充原始对象中的属性(依赖注入);
- 如果原始对象中的某个方法被 AOP 了,那么则需要根据原始对象生成一个代理对象;
- 把最终生成的代理对象放入单例池(