1、什么是循环依赖
众所周知,Spring的容器中管理整个体系的bean对象。每个bean对象是java中的一个实例化的完整对象。一个完整对象就包含属性和方法,一个对象中的属性可以是另外一个对象的引用。所以在这时就会出现A对象的属性是B,B的属性如果是A的话,则两个对象相关依赖,都无法完成实例化的属性赋值。
2、解决循环依赖的原理
在传统的获取对象的方式是通过new一个对象,并将各种属性值放入对象中,等一切初始化工作完成之后,将这个完整的对象返回给使用者。如果在设置属性时,值对象为空时,会抛出空指针问题,则创建失败。
Spring则是将整个bean的创建进行分步进行,并将创建的半成品bean对象进行缓存,等需要的属性对象完成创建之后,在回头完善这个半成品bean。如果在创建属性对象时,出现循环依赖的现象时,将半成品对象提供给属性对象,则属性对象能够完整创建,就解决了循环依赖的问题。
3、Spring通过三级缓存解决循环依赖
例如:A对象的属性是B对象,B对象的属性是A对象。
三级缓存分别是
- 一级缓存singletonObjects
- 初始大小为256
- 存放完整的bean对象
- 二级缓存earlySingletonObjects
- 初始大小为16
- 存放半成品的bean对象
- 三级缓存singletonFactories
- 初始大小为16
- 存放singletonFactorie
- singletonFactorie是一个函数接口,通过调用getObject方法会触发调用getEarlyBeanReference方法来获取一个半成品的bean对象。
从缓存的初始大