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){
	....
}
相关推荐
我材不敲代码1 分钟前
Python venv 虚拟环境从入门到精通 + uv 高性能替代工具实战指南
开发语言·python·uv
用户3983461612011 分钟前
Go-Spring 实战第 15 课 —— Condition:根据配置和上下文激活 Bean
spring·go
l1t12 分钟前
DeepSeek总结的使用实体-组件-系统和基于存在性处理进行Python编程18-20
开发语言·python
磊 子19 分钟前
STL之deque和list以及两者与vector的对比
开发语言·c++·list
凤山老林20 分钟前
DDD(领域驱动设计)在复杂业务系统中的落地指南
java·开发语言·数据库·ddd·领域驱动
JEECG低代码平台25 分钟前
JimuChatBI — 首款免费开源的 Java 智能问数ChatBI平台,零成本接入,AI对话式智能分析
java·人工智能·开源·aigc·人工智能低代码
凯瑟琳.奥古斯特31 分钟前
子查询原理与实战案例解析
开发语言·数据库·职场和发展·数据库开发
Eiceblue32 分钟前
Python 操作 Excel:数据分组、分类汇总与取消分组全解
开发语言·python·excel
霸道流氓气质33 分钟前
SpringBoot中使用Spring AI框架集成本地Ollama实现AI快速对话完整示例
人工智能·spring boot·spring
山上三树34 分钟前
C/C++ 高频报错速查表(开发通用版)
c语言·开发语言·c++