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){
	....
}
相关推荐
m0_475064502 分钟前
Spring AI文档切片
java·人工智能·spring
我登哥MVP2 分钟前
【SpringMVC笔记】 - 1 - SpringMVC入门
java·spring boot·spring·tomcat·maven·intellij-idea·springmvc
Arva .5 分钟前
Spring 事务传播机制 速记
java·数据库·spring
代码改善世界6 分钟前
【C++初阶】stack和queue用法详解:常用接口、模拟实现与面试题(附完整代码)
开发语言·c++
0xDevNull8 分钟前
Spring Boot 2.0动态多数据源切换实战教程
java·后端
语戚12 分钟前
力扣 2463. 最小移动总距离 —— 动态规划 & 贪心排序全解(Java 实现)
java·算法·leetcode·贪心算法·动态规划·力扣·dp
少司府13 分钟前
C++基础入门:类和对象(下)
开发语言·c++·类型转换·类和对象·友元
小白学大数据15 分钟前
Python 爬虫:拍卖网站列表页与详情页数据联动爬取
开发语言·爬虫·python
techdashen17 分钟前
Go 1.25 新特性:Flight Recorder —— 像黑匣子一样捕捉线上 Bug
java·golang·bug
妃衣17 分钟前
Html转word追加篇,关于hr标签分割线的显示
java·html·word