Spring源码阅读-02:Spring是如何加载Bean?创建Bean的?Bean生命周期?
02-什么是循环依赖?
解释:A对象需要创建B对象,随后创建B对象的时候发现需要创建A对象,
这个时候A对象并没有创建出来,他需要先创建B对象,但是B对象的创建又需要A对象的实例,相互依赖,那么就会构成一个循环。
而我们又知道对象有两种状态
我们截断最后一个步骤,阻断闭环,
用一个Map容器来存储对象,放入到我们Spring容器中
实例化A时候,由于B没有实例化为空,所以A只能完成一个实例化,并没有完成初始化,只能算是一个半成品,这个时候将“A(半成品)”放入到Map映射中。
Map映射也在Spring的容器之中。
与上面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表达式。



