聊-聊Spring中bean的循环依赖问题?

简介: Spring通过三级缓存解决循环依赖:一级缓存存放完整单例Bean,二级缓存存放早期半成品Bean,三级缓存存放对象工厂用于创建代理等对象。A依赖B、B依赖A时,先创建A并放入三级缓存,实例化B时通过三级缓存获取A的工厂生成早期引用并放入二级缓存,B完成初始化后注入A,再将B注入A,最终双方都成功创建并放入一级缓存,流程结束清除二级缓存临时对象。

循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环,比如A依赖于B,B依赖于A。
循环依赖在spring中是允许存在,spring框架通过内部的三级缓存来解决了大部分的循环依赖问题。三级缓存,每一级缓存的作用如下:
①一级缓存:singletonObjects 单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象②二级缓存:earlySingletonObjects 缓存早期的bean对象(生命周期还没走完,半成品的bean)
③三级缓存:singletonFactories 缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的(比如创建代理对象)
具体的流程大概是这个样子的:
第一,先实例A对象,同时会创建ObjectFactory对象存入三级缓存singletonFactories
第二,A在初始化的时候需要B对象,这个走B的创建的逻辑
第三,B实例化完成,也会创建ObjectFactory对象存入三级缓存singletonFactories
第四,B需要注入A,通过三级缓存中获取ObjectFactory来生成一个A的对象同时存入二级缓存,这个是有两种情况,一个是可能是A的普通对象,另外一个是A的代理对象,都可以让ObjectFactory来生产对应的对象,这也是
三级缓存的关键第五,B通过从通过二级缓存earlySingletonObjects 获得到A的对象后可以正常注入,B创建成功,存入一级缓存singletonObjects
第六,回到A对象初始化,因为B对象已经创建完成,则可以直接注入B,A创建成功存入一次缓存singletonObjects

相关文章
|
缓存 搜索推荐 关系型数据库
Elasticsearch - 闲聊ElasticSearch中的分页
Elasticsearch - 闲聊ElasticSearch中的分页
620 0
|
存储 Java 网络安全
SpringCloud GateWay配置(TLS 和 SSL、Http超时配置)—官方原版
SpringCloud GateWay配置(TLS 和 SSL、Http超时配置)—官方原版
2719 0
|
3月前
|
API 数据库
邮箱验证-邮箱校验-邮件地址验证-电子邮件地址校验接口介绍
本API提供邮箱验证服务,可快速检测邮箱格式、MX记录、是否为一次性邮箱等,有效提升邮件送达率、保护发件人信誉、降低营销成本、维护客户数据库准确性,助力企业高效精准触达真实用户。
192 1
|
5月前
|
数据采集 安全 API
邮箱验证-邮箱校验-邮件地址验证-电子邮件地址校验API接口介绍
本服务提供邮箱全方位核验:校验格式、MX解析、识别临时/虚假/高风险邮箱,有效防范恶意注册、垃圾信息与欺诈。适用于注册验证、会员实名、邮件触达、安全通知及表单数据清洗等场景,保障数据真实可信。
460 5
|
消息中间件 存储 缓存
大厂面试高频:Kafka 工作原理 ( 详细图解 )
本文详细解析了 Kafka 的核心架构和实现原理,消息中间件是亿级互联网架构的基石,大厂面试高频,非常重要,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:Kafka 工作原理 ( 详细图解 )
|
安全 Java API
JUC系列《深入剖析ConcurrentHashMap:高并发环境的Map最优解 》
本文深入解析Java并发容器ConcurrentHashMap,从JDK 1.7分段锁到JDK 1.8的CAS+synchronized优化,剖析其高性能设计原理,并结合核心API与实战代码,详解线程安全、原子操作及LongAdder性能优化技巧,助你掌握高并发编程利器。
|
9月前
|
SQL XML Java
对于 MyBatis Plus 和 MyBatis我们究竟该怎么选择?
MyBatis是轻量级半自动ORM框架,SQL自定义灵活,适合复杂查询;MyBatis Plus在其基础上封装通用CRUD,提升开发效率,支持Lambda与分页插件。两者可混合使用,兼顾效率与灵活性,适用于不同场景。
|
9月前
|
人工智能 自然语言处理 安全
2025 热门智能客服系统推荐:适配互联网企业与电商场景需求
2025年,智能客服已成为电商与互联网企业服务中枢。瓴羊Quick Service、Zendesk Answer Bot、Intercom Fin等系统在意图识别、多渠道整合、知识库运维及合规认证方面表现突出,支持高并发、多轮对话与业务数据联动,满足电商大促、全球化运营与复杂客服场景需求,助力企业实现高效、智能的客户服务升级。
HashMap的put方法的具体流程?
1. 判断键值对数组table[i]是否为空或为null,否则执行resize()进行扩容; 2. 根据键值key计算hash值得到插入的数组索引i,如果table[i]==null,直接新建节点添加,转向 ⑥,如果table[i]不为空,转向③; 3. 判断table[i]的首个元素是否和key一样,如果相同直接覆盖value,否则转向④,这里的相同指的 是hashCode以及equals; 4. 判断table[i] 是否为treeNode,即table[i] 是否是红黑树,如果是红黑树,则直接在树中插入键值 对,否则转向5; 5. 遍历table[i],判断链表长度是否大于8,大于8的
|
Java Spring 容器
@Resource 和 @Autowired 介绍 为什么使用 @Autowired 会报错,改成@Resource 就对了
本文介绍了`@Autowired`和`@Resource`两种依赖注入注解的区别及使用场景,并解释了为什么在某些情况下使用`@Autowired`会导致错误,而改成`@Resource`则可以解决问题。
1364 0

热门文章

最新文章