Spring---循环依赖


/**
     *  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
     */