很古老的一个问题,面试可能问的比较多,最近在排查问题的时间专门去跟踪了一下.
要解答这个问题,需要首先知道spring bean的创建流程:
- 实例化bean
bean new 出来之后会放入singletonFactories中,singletonFactories是遇到循环依赖后,用来创建Bean的 - 设置bean的property
- 调用bean生命周期hook
完了之后bean会放入singletonObjects中.
举一个循环依赖的情况:
A依赖B, B依赖A
首先创建Bean A.
- 实例化 Bean A
- 将Bean A 放入 singletonFactories
- 设置Bean A的property, 这时候会去找Bean B, 发现Bean B并没有创建,同样走Bean A实例化的流程
- 实例化 Bean B
- 将Bean B 放入 singletonFactories
- 设置Bean B的property, 这时候会去找Bean A, 下面我们看一下查找过程:
1 | protected Object getSingleton(String beanName, boolean allowEarlyReference) { |
getSingleton 方法就是解决循环依赖的答案,在我们的例子中就是Bean B 在找Bean A的时候,其实Bean A并不是完全构造的,就是 Bean A的property还是设置完,但并不影响解决循环依赖.