spring循环引用解决原理

主要一点,早期暴露半成品对象会被维护到早期暴露缓存中;

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创建完毕放入单例池

如果循环依赖层次更深那就进行更深层次的递归调用;

你可能感兴趣的:(spring循环引用解决原理)