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){
	....
}
相关推荐
柯3492 小时前
JVM-类加载机制
java·开发语言·jvm
风雨无阻fywz2 小时前
java 类的实例化过程,其中的相关顺序 包括有继承的子类等复杂情况,静态成员变量的初始化顺序,这其中jvm在干什么
java·开发语言·jvm
画个大饼2 小时前
Swift中Class和Struct的深度对比分析
开发语言·ios·swift
沃野_juededa2 小时前
关于uniapp 中uview input组件设置为readonly 或者disabled input区域不可点击问题
java·前端·uni-app
小羊Linux客栈5 小时前
Python小程序:上班该做点摸鱼的事情
开发语言·python·小程序·游戏程序
红烧柯基5 小时前
解决redis序列号和反序列化问题
java·数据库·redis
咛辉5 小时前
如何搭建spark yarn 模式的集群集群。
开发语言
CoderCodingNo6 小时前
【GESP】C++三级练习 luogu-B2118 验证子串
开发语言·c++
小彭努力中6 小时前
9.Three.js中 ArrayCamera 多视角相机详解+示例代码
开发语言·前端·javascript·vue.js·数码相机·ecmascript·webgl