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

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

💡 原文中文,约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对象都成功创建,循环依赖问题得到解决。
➡️

继续阅读