java——Spring 中循环依赖 三级缓存

在Spring框架中,循环依赖是一个常见的问题,它指的是两个或多个Bean之间互相依赖,形成一个闭环,导致无法准确地完成对象的创建和初始化。为了解决这个问题,Spring引入了三级缓存机制。以下是对Spring中循环依赖和三级缓存的详细解释:

一、循环依赖的定义与场景

循环依赖通常发生在以下场景:

  • 直接循环依赖:两个Bean互相依赖,例如Bean A依赖于Bean B,同时Bean B也依赖于Bean A。
  • 间接循环依赖:通过多个Bean形成一个依赖链,最终回到起点,形成一个闭环。

二、三级缓存的定义与作用

Spring的三级缓存主要由三个Map数据结构组成,分别用于存储不同状态的Bean:

  • 一级缓存(singletonObjects):存储已经完全初始化和实例化的Bean对象。这个缓存的目的是确保Bean只初始化一次(是单例的),避免多次实例化相同的Bean对象,提高性能。
  • 二级缓存(earlySingletonObjects):存储尚未完成属性注入和初始化的“半成品”Bean对象。当Spring容器发现两个或多个Bean之间存在循环依赖时,会将这些未完全初始化的对象提前暴露在二级缓存中,以便其他Bean进行引用,确保它们之间的依赖能够被满足。
  • 三级缓存(singletonFactories):存储ObjectFactory类型的代理工厂对象。主要用于处理存在AOP(面向切面编程)时的循环依赖问题。每个Bean都对应一个ObjectFactory对象,通过调用该对象的getObject方法,可以获取到早期暴露出去的Bean。

DefaultSingletonBeanRegistry中定义的这三个map

//一级缓存
private final Map<Stri
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值