如何解决循环依赖
使用三级缓存
- singletonObjects
- earlySingletonObjects
- singletonFactories
具体流程
A类依赖B B又依赖A (A->B->A)
代码入口可以看spring源码getBean方法,大致流程
- 首先假设进行实例化A对象
- 会从一级缓存判断A是否存在,不存在就会进行A的实例化即createBean
- 创建A对象之间会先打个标记标记A正在创建中
- 然后开始创建A会判断A是不是单例,是否允许提前暴露,是否在创建中,全部为true,就会吧A放到三级缓存singletonFactoriessingletonFactories
- 下面会进行属性赋值和依赖注入,这时候假设要注入B,B也会走一遍A的上面的流程。
- 不同的是当B发现需要注入A的时候,会从1级缓存中获取A
- 没有获取到,就判断A是不是还在创建中,是的话就会从2级缓存中获取A,获取不到就从3级缓存中获取。(上面也说了A已经在三级缓存中了,这时候的A是一个不完整的bean,但是不耽误用)
- 获取之后就吧A放进2级缓存,并从三级缓存移除。
- B这时候能正常的注入A,他的初始化是没问题的。成功之后就会把B放进1级缓存
- 这时候在回到A的初始化流程中,A就能获取到一个初始化完整的B了
- A完成了初始化