Spring解决循环依赖的理解

▐ Spring

Spring是自动创建对象场景的典型,它采用三级缓存的方式解决循环引用对象的创建。

一级缓存:已经完全创建好的对象的缓存;

二级缓存:正在创建中,某些成员还未装载的对象的缓存;

三级缓存:存放创建对象方法的缓存(即存放工厂,而非对象的缓存)。

假定类A对象引用类B对象,类B对象引用类A对象,在创建类A对象的过程中,需要装载B对象,这时首先会在一级缓存中寻找B对象,若没有,则在二级缓存在找,若依然没有,则会从三级缓存找到创建B的方法,并创建一个"裸"bean(未装载成员对象的bean),放进二级缓存,然后将这个对象装载给A对象,同时还会将三级缓存中创建B的方法移除,防止重复创建,最后将A对象放入一级缓存。创建B对象时,直接在一级缓存中即可找到A对象进行装载,最后再将自己放入一级缓存中。

实际整个过程中,二级缓存承担的是解决循环引用问题的角色,个人理解三级缓存主要是为了实现上的优雅而存在的,没有也不影响循环引用问题的解决。

原文地址:https://www.cnblogs.com/JohnsonLiu/p/15391918.html