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){
	....
}
相关推荐
洞窝技术6 分钟前
Redis 4.0 升级至 5.0 实施手册
java·redis
无代码专家17 分钟前
设备巡检数字化解决方案:构建高效闭环管理体系
java·大数据·人工智能
未来之窗软件服务27 分钟前
操作系统应用(三十三)php版本选择系统—东方仙盟筑基期
开发语言·php·仙盟创梦ide·东方仙盟·服务器推荐
是Dream呀32 分钟前
昇腾实战|算子模板库Catlass与CANN生态适配
开发语言·人工智能·python·华为
tanxiaomi33 分钟前
Redisson分布式锁 和 乐观锁的使用场景
java·分布式·mysql·面试
零匠学堂202534 分钟前
移动学习系统,如何提升企业培训效果?
java·开发语言·spring boot·学习·音视频
小杨快跑~41 分钟前
从装饰者到桥接再到工厂:模式组合的艺术
java·开发语言·设计模式
say_fall44 分钟前
C语言编程实战:每日一题:随机链表的复制
c语言·开发语言·链表
饕餮争锋44 分钟前
Spring内置的Bean作用域介绍
java·后端·spring
却话巴山夜雨时i44 分钟前
394. 字符串解码【中等】
java·数据结构·算法·leetcode