Spring解决循环引用
跟着孙哥学Spring,b站:https://www.bilibili.com/video/BV185411477k/?spm_id_from=333.337.search-card.all.click
要理解Spring是如何解决循环引用的,首先需要掌握Spring的三个关键Map对象:
● singletonObjects:线程安全,存储完全初始化的单例Bean。
● earlySingletonObjects:存储已被实例化但未完全初始化的单例Bean,未进行属性填充和初始化。
● singletonFactories:存储创建单例Bean的ObjectFactory。
对象创建的三个主要步骤
Spring创建对象经历以下三个阶段:
● 实例化对象
● 属性填充
● 初始化
在实例化BeanA后,Spring会将创建单例BeanA的ObjectFactory存入singletonFactories。
属性填充阶段
在填充BeanA的属性时,如果发现某个属性引用了BeanB,Spring会尝试从缓存中获取BeanB。当从缓存中获取不到BeanB时,会走创建bean对象的流程。
当BeanB的属性填充遇到BeanA时,Spring会从singletonFactories获取相应的ObjectFactory,并通过回调其方法来实际创建BeanA的完整实例。
1. 从singleFactories中,获取创建beanA的工厂对象,利用函数式接口回调,创建“不完整”的对象BeanA。
2. 将“不完整”的对象BeanA存入earlySingleObjects,此时BeanA尚未进行属性填充和初始化。
3. 接口回调后,Spring会将BeanA放入earlySingletonObjects,表示该BeanA已被创建但尚未完全初始化。接着,Spring会从singletonFactories中移除对应的ObjectFactory。
走完protected Object getSingleton(String beanName, boolean allowEarlyReference)
这个方法,返回了“不完整”的BeanA,对象B属性填充阶段和初始化阶段,接着按流程走完。
对象B已经是一个完整的对象了。
此时需要进行三个Map的维护:
addSingleton(beanName, singletonObject)
方法详情:
将对象BeanB存入singletonObject中,并从earlySingletonObjects中将“不完整”的BeanB移除。
接着,对象BeanA进行属性填充和初始化流程。
至此,Spring已经解决了循环引用
问题。
孙哥的随堂笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix