/**
* what?
* A对象中有属性B对象,B对象中有属性A对象;
* 创建任何对象,都是先实例化,后初始化;
*
* 如何解决循环依赖?
* 1、实例化(createBeanInstance) 与 初始化(populateBean,initializeBean) 分开;
* 2、设置缓存预存对象(先将 先实例化的A对象 缓存起来,在B对象初始化设置属性A时,从 缓存中获取A实例,进行赋值);
*
* 使用半成品对象会有问题,如何解决?
* spring3级缓存:org.springframework.beans.factory.support.DefaultSingletonBeanRegistry
*
* 1级缓存:
* private final Map singletonObjects = new ConcurrentHashMap<>(256);
* k:beanName
* v:bean
*
* 2级缓存:
* private final Map earlySingletonObjects = new HashMap<>(16);
* k:beanName
* v:本成品bean
*
* 3级缓存:
* private final Map> singletonFactories = new HashMap<>(16);
* k:beanName
* v:lambada表达式
*
*/
/**
* @Service
* public class CycleDependencyAServiceImpl implements CycleDependencyAService {
*
* @Autowired
* private CycleDependencyBService cycleDependencyBService;
*
* }
*
* @Service
* public class CycleDependencyBServiceImpl implements CycleDependencyBService {
*
* @Autowired
* private CycleDependencyAService cycleDependencyAService;
*
* }
*
* 容器:
*
* CycleDependencyAServiceImpl@5456
* CycleDependencyBServiceImpl@5640
*
*
*
* singletonObjects singletonFactories earlySingletonObjects
*
* null null null
*
* 实例化A,填充属性B null cycleDependencyAServiceImpl:getEarlyBeanReference(beanName, mbd, bean) null
*
* 实例化B,填充属性A null cycleDependencyAServiceImpl:getEarlyBeanReference(beanName, mbd, bean) null
* cycleDependencyBServiceImpl : getEarlyBeanReference(beanName, mbd, bean)
*
* null cycleDependencyBServiceImpl : getEarlyBeanReference(beanName, mbd, bean) cycleDependencyAServiceImpl :CycleDependencyAServiceImpl@5456(cycleDependencyBService = null)
*
* cycleDependencyBServiceImpl : CycleDependencyBServiceImpl@5640 null null
*
* 填充属性B cycleDependencyBServiceImpl : CycleDependencyBServiceImpl@5640 null null
* cycleDependencyAServiceImpl : CycleDependencyAServiceImpl@5456
*/