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

createh53个月前 (03-04)技术教程28

缓存其实就是三个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都进入一级缓存中待用户使用;

相关文章

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

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

Spring之IOC&依赖注入

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

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

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

简单2步实现maven打包java工程并将依赖jar输出到指定目录

最近由于为了验证的需要,在本地使用maven打包时需要将工程依赖的jar同步输出到指定文件夹, 通过验证,将此方法分享给大家1. pom文件中引用如下2个插件 org.apache.maven.p...

Spring Bean 依赖注入常见错误(上)

你好,我是小七,这期我们来聊聊 Spring @Autowired。提及 Spring 的优势或特性,我们都会立马想起“控制反转、依赖注入”这八字真言。而 @Autowired 正是用来支持依赖注入的...

Maven依赖解析之倍增提速!eBay Velocity实践的开源新算法

1缘 起Maven 作为程序员所熟悉的构建工具,在eBay内部同样被广泛使用。maven-resolver 是Maven的核心组件。它将项目声明的所有依赖 (dependency) 予以解析,算得依赖...