透过源码,捋清楚循环依赖到底是如何解决的!

透过源码,捋清楚循环依赖到底是如何解决的!

💡 原文中文,约13700字,阅读约需33分钟。
📝

内容提要

本文从源码角度解析Spring循环依赖的解决过程,重点分析createBean方法中的关键点,包括向三级缓存中添加回调函数和填充属性。

🎯

关键要点

  • 本文从源码角度解析Spring循环依赖的解决过程。

  • 假设有两个Bean A和B,存在循环依赖。

  • 获取Bean时涉及到三级缓存,主要通过getBean方法进行初始化。

  • doGetBean方法是Bean初始化的关键,首先尝试从一级缓存获取Bean。

  • 如果一级缓存没有找到Bean,则检查是否存在循环依赖。

  • 如果Bean是单例,则调用getSingleton方法获取实例,并在其中调用createBean方法。

  • getSingleton方法首先从一级缓存查找,如果未找到则查找二级缓存和三级缓存。

  • 三级缓存中存储的是创建Bean的回调函数,允许提前引用。

  • createBean方法负责Bean的创建过程,包括属性填充和初始化。

  • populateBean方法用于填充Bean的属性,涉及到@Autowired注解的处理。

  • doResolveDependency方法用于解析依赖,找到匹配的Bean。

  • 后续流程中,B对象创建后需要注入A对象,形成循环依赖的解决。

  • 最终,A和B对象都成功创建,循环依赖问题得到解决。

🏷️

标签

➡️

继续阅读