先说结论,spring通过三级缓存机制来解决循环依赖问题,构造器依赖除外,即构造器注入可能会报错。
循环依赖的情况如下:
首先spring初始化bean的步骤如下:
这里只需要简单的理解为三步:
- 实例化
- 填充属性(注入依赖)
- 初始化完成
spring在创建Bean A的时候会先去一级缓存(singletonObjects),如果一级缓存没有则再从二级缓存(earlySingletonObjects)中获取,如果二级缓存也没有,则再从三级缓存(singletonFactories)中获取,如果还获取不到,则实例化一个A,然后放入三级缓存,然后填充属性,此刻发现依赖B,于是创建B,同样的经过上述步骤,由于每级缓存都获取不到,于是实例化B,然后填充属性,发现依赖A,然后依