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 分钟前
RuoYI框架.net版本实现Redis数据隔离
java·开发语言
.格子衫.4 分钟前
Maven高级
java·maven
lkbhua莱克瓦245 分钟前
Java基础——常用算法4
java·数据结构·笔记·算法·github·排序算法·快速排序
.格子衫.8 分钟前
Maven前奏
java·pycharm·maven
m0_7482480217 分钟前
揭开 C++ vector 底层面纱:从三指针模型到手写完整实现
开发语言·c++·算法
海盗猫鸥17 分钟前
「C++」string类(2)常用接口
开发语言·c++
Mos_x23 分钟前
springboot系列--自动配置原理
java·后端
神奇侠202429 分钟前
基于spring-boot-admin实现对应用、数据库、nginx等监控
java·数据库·nginx
yugi98783836 分钟前
基于Qt框架开发多功能视频播放器
开发语言·qt
whm277738 分钟前
Visual Basic 手工制作工具栏
开发语言·visual studio