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){
	....
}
相关推荐
weixin_3077791310 分钟前
使用C#配置信息类的属性生成Snowflake CREATE STAGE语句
开发语言·数据仓库·hive·c#
疾跑哥布林升级版13 分钟前
C++---day7
开发语言·c++·算法
东方窅瞳17 分钟前
MDX语言的云计算
开发语言·后端·golang
凸头41 分钟前
juc并发包的常用类、线程安全实现方式、锁机制及 JVM 优化策略
java
honey ball1 小时前
EMC内参二(1-33页)学习【技术进阶】
开发语言·单片机·嵌入式硬件·学习
程序员老茶1 小时前
C++:函数
开发语言·c++
橘子青衫1 小时前
掌握HttpClient技术:从基础到实战(Apache)
java·后端·架构
我真的不会C1 小时前
Qt中的多种输出方式,信号与槽的基本使用
开发语言·qt
ylfhpy1 小时前
Java面试黄金宝典35
java·数据库·sql·算法·面试·职场和发展
阿巴阿巴拉1 小时前
Scala相关知识学习总结5
开发语言·学习·scala