Java面试题:Spring循环引用(循环依赖)

Spring中的循环引用

在创建A时需要B,创建B时需要A

三级缓存解决循环依赖问题

在Spring中定义了一个类

DefaultSingletonBeanRegistry

中定义了三个map

singletonObjects 一级缓存

单例池,存放完整初始化的bean对象

earlySingletonObjects 二级缓存

缓存早期的bean对象(执行构造函数还没执行其他周期的bean)

singletonFactories 三级缓存

缓存ObjectFactory,对象工厂,用于创建bean

如果bean是多例的,那么只有需要bean时才会创建bean

循环依赖的解决过程

二级缓存可以解决一般对象的循环依赖

但是如果是代理对象需要三级缓存解决

每次需要注入时
在三级缓存中放入一个对应的对象工厂
从对象工厂中创建代理对象注入二级缓存
再从二级缓存获取代理对象进行依赖注入
构造方法循环依赖无法自动解决

通过在需要引用的对象前面加一个@lazy实现懒加载

java 复制代码
public A(@lazy B b){
	....
}
相关推荐
坚持就完事了几秒前
数据结构之树(Java实现)
java·算法
Monly213 分钟前
Java:修改打包配置文件
java·开发语言
roman_日积跬步-终至千里4 分钟前
【架构设计与实现】动态数据源切换:核心代码实现手册
java
XiaoFan01212 分钟前
免密批量抓取日志并集中输出
java·linux·服务器
顾北1219 分钟前
MCP服务端开发:图片搜索助力旅游计划
java·spring boot·dubbo
我命由我1234525 分钟前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime
赛姐在努力.27 分钟前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
yxc_inspire30 分钟前
Java学习第二天
java·面向对象
毕设源码-赖学姐32 分钟前
【开题答辩全过程】以 基于net超市销售管理系统为例,包含答辩的问题和答案
java
island131433 分钟前
CANN ops-nn 算子库深度解析:核心算子(如激活函数、归一化)的数值精度控制与内存高效实现
开发语言·人工智能·神经网络