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