大致的流程就是:
1. 类 A 与 B 中属性相互引用,造成循环依赖
2. A 实例化完成,将自己提前曝光到 singletonFactories 缓存中(这里是三级缓存)
3. A 实例进行依赖注入,发现自己依赖对象 B,就尝试获取 B 实例引用
4. B 此时还没初始化,先进行实例化并将自己曝光到 singletonFactories 缓存中(这里也是三级缓存)
5. B 实例进行依赖注入,发现自己依赖对象 A,就尝试获取 A 实例引用
6. 由于 A 实例尚未初始化完成,从 singletonObjects 中获取不到,从 earlySingletonObjects 中获取也没有,最后从 singletonFactories 中获取到(从一级缓存开始找,没有,二级缓存,也没有,去三级缓存,有了)
7. A 实例从 singletonFactories 中删除,添加到 earlySingletonObjects 缓存中去(找到后从三级缓存拿走,放到二级缓存中)
8. B 实例拿到 A 实例引用后顺利完成依赖注入及初始化,并将自己从 singletonFactories 缓存中删除,添加到 singletonObjects 缓存中(实例化好并且依赖注入好,放到一级缓存中)
9. A 实例获取 B 实例引用后,A 实例也能继续完成依赖注入及后续初始化操作
10. A 是从 earlySingletonObjects 中删除,添加到 singletonObjects 缓存中(从二级缓存中删除,放到一级缓存中)
看一下相关面试题:
面试题链接(好难)