栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring原理深入-03:面试官-“Spring如何解决循环当依赖问题?”

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring原理深入-03:面试官-“Spring如何解决循环当依赖问题?”

01-需要复习一下前置知识:

Spring源码阅读-02:Spring是如何加载Bean?创建Bean的?Bean生命周期?

02-什么是循环依赖?


解释:A对象需要创建B对象,随后创建B对象的时候发现需要创建A对象,
这个时候A对象并没有创建出来,他需要先创建B对象,但是B对象的创建又需要A对象的实例,相互依赖,那么就会构成一个循环。

03-Spring是如何解决循环依赖问题-逻辑? 1,解决问题核心思路:

2,对象的两种状态:

而我们又知道对象有两种状态

3,解决步骤:

我们截断最后一个步骤,阻断闭环,
用一个Map容器来存储对象,放入到我们Spring容器中

(1)A(半)

实例化A时候,由于B没有实例化为空,所以A只能完成一个实例化,并没有完成初始化,只能算是一个半成品,这个时候将“A(半成品)”放入到Map映射中。
Map映射也在Spring的容器之中。

(2)B(半)

与上面A半成品一样,没有完成初始化,只完成实例化,所以把B半成品也放入Map映射中。

(3)B(成品)

判断中,我们在容器中找到A(半成品)的地址,将A(半成品)的对象引用赋值给B对象的A属性,完成初始化操作,因此B完成了初始化操作,成为一个成品对象。

(4)A(成品)

当B的成品对象完成之后,逆着链路,追寻到最初需要创建B对象的应用场景中(A对象初始化中),将B(成品)的对象引用赋值给,A中的B对象属性。

03-Spring是如何解决循环依赖问题-代码:

如果对于Spring有学习有一定基础就一定会知道的,Spring是通过三级村缓存来解决的循环依赖问题:

可能有小伙伴懵了,不是用Map来解决吗?怎么又到三级缓存了?那么我们先来看一个map在Spring中使用的实现类DefaultSingletonBeanRegistry :

public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {

	
	private static final int SUPPRESSED_EXCEPTIONS_LIMIT = 100;


	
	private final Map singletonObjects = new ConcurrentHashMap<>(256);

	
	private final Map> singletonFactories = new HashMap<>(16);

	
	private final Map earlySingletonObjects = new ConcurrentHashMap<>(16);

看到了,我们所说简单粗暴的理解三个Map组成,Spring的三级缓存。用来解决循环依赖问题。
三个Map的详细用途,我认为上面注释已经写得很清楚。
但是关于三级缓存泛型中ObjectFactory还是要解释一下:

ObjectFactory是一个函数式接口,是一个Lambda表达式,可以通过getObject获取(JDK1.8新特性)
当做一个参数传递到方法中,一般情况下传的Lambda表达式,可以通过getObject方法来执行Lambda表达式。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/581647.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号