主要一点,早期暴露半成品对象会被维护到早期暴露缓存中;
getSingleton方法如果在单例池中拿不到对象,则会去早期暴露缓存中看看有没有,有则直接返回
而循环引用的过程A包含属性B,B包含属性A;
创建A对象->先去getSingletonA返回null->实例化A对象->并进行半成品早期暴露【将A维护到早期暴露缓存】->A属性注入B->获取B->getSingletonB返回null->实例化B->并进行半成品早期暴露【将B维护到早期暴露缓存】->B属性注入A->获取A->getSingletonA返回A早期暴露引用->B创建完毕放入单例池返回注入A->A创建完毕放入单例池
如果循环依赖层次更深那就进行更深层次的递归调用;