Java:Spring用三级缓存解决循环依赖问题

createh52周前 (03-04)技术教程5

缓存其实就是三个Map容器:singletonObjects, 一级缓存;earlySingletonObjects, 二级缓存;singletonFactories 三级缓存。如下图

例如:A引用B ,B引用A;Spring是如何帮我们创建A和B对象:

1

对象A要创建到Spring容器中,从一级缓存singletonObject获取A,不存在,开始实例化A,最终在三级缓存singletonObjectFactory添加(A,A的函数式接口创建方法),这时候A有了自己的内存地址;

2

设置属性B,B也从一级缓存singletonObject获取B,不存在,开始实例化B,最终在三级缓存singletonObjectFactory添加(B,B的函数式接口创建方法),这时候B有了自己的内存地址;

3

B中开始给属性A赋值,此时会找到三级缓存中的A,并将A放入二级缓存中。删除三级缓存;

4

B初始化完成,从三级缓存singletonObjectFactory直接put到一级缓存singletonObject,并删除二级和三级缓存的自己;

5

A成功得到B,A完成初始化动作,从二级缓存中移入一级缓存,并删除二级和三级缓存的自己;

6

最终A和B都进入一级缓存中待用户使用;

相关文章

解决maven依赖冲突,这篇就够了

一、前言什么是依赖冲突依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成了包版本冲突。依赖冲突的原因我们在maven项目的pom中 一般会引用许许多多的dependency。例如,项目A...

大厂面试必问之Spring的循环依赖

面试的重点,大厂必问之一:循环依赖1. 什么是循环依赖看下图image.png??上图是循环依赖的三种情况,虽然方式有点不一样,但是循环依赖的本质是一样的,就你的完整创建要依赖与我,我的完整创建也依赖...

Java项目中启动报错循环依赖问题解决

项目启动时候失败,有时候经常看到这样的错误信息:Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationExceptio...

彻底搞懂Spring依赖注入(一)Bean实例创建过程

上一章介绍了Bean的加载过程(IOC初始化过程),加载完成后,紧接着就要用到它的依赖注入(IOC 依赖注入)。那什么是依赖注入呢?所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到...

Spring之IOC&依赖注入

0x01、Spring1什么是Spring Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的(解耦)。? 框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时...

手把手教你解决循环依赖,一步一步地来窥探出三级缓存的奥秘

先不去管Spring中的循环依赖,我们先实现一个自定义注解,来模拟@Autowired的功能。一、自定义注解模拟@Autowired自定义Load注解,被该注解标识的字段,将会进行自动注入/** *...