spring 循环依赖 三级缓存 二级缓存
Bean生命周期单例bean实例化后调用的方法
// Callback interface triggered at the end of the singleton pre-instantiation phase
// during {@link BeanFactory} bootstrap.
public interface SmartInitializingSingleton {
void afterSingletonsInstantiated();
}
postProcessBeanDefinitionRegistry负责扫描注解变成beanDefinition对象,放入Map中
三级缓存作用private final MapObjectFactorysingletonObjects = new ConcurrentHashMap<>(256); private final Map > singletonFactories = new HashMap<>(16); private final Map earlySingletonObjects = new ConcurrentHashMap<>(16);
将半成品对象提前暴露,本质是一个Lambda表达式() ->getEarlyBeanReference(beanName, mbd, bean),被AbstractAutoProxy实现,即该类用来实现APO的。
可以用两级缓存吗用一级缓存和三级缓存就可以解决循环依赖:将半成品对象提前暴露在ObjectFactory中
但如果有aop的话,每次调用ObjectFactory都会产生一个代理对象,这就不能保证单例了,所以需要二级缓存来存代理对象
参考
Spring中的循环依赖
Spring 为何需要三级缓存解决循环依赖,而不是二级缓存?



