先看网上的回到
spring 的三级缓存:
一级:singletonObjects,保存已初始化的 bean;
二级:earlySingletonObjects,保存被代理或实例化的 bean;
三级:singletonFactories,保存包装实例化的工厂bean;
去掉第三级singletonFactories,如果需要代理的,需要提前生成代理,破坏了spring的设计:实例化--属性填充--初始化--代理。
去掉第二级earlySingletonObjects,如果有多个bean和其中一个beanA存在循环依赖,并且先实例化的那个beanA存在代理,那每个bean来填充属性beanA都会通过singleFactory.getObject()产生新代理。
我的疑问是,为什么每个bean来填充属性beanA都会产生新的代理呢?以下是我改写的代码:
@Nullable
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
synchronized (this.singletonObjects) {
// 再次从 singletonObjects 获取 bean
singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null && allowEarlyReference) {
ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
if (singletonFactory != null) {
singletonObject = singletonFactory.getObject();
// 将代理或原始实例化的 bean 加入 singletonObjects
this.singletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
return singletonObject;
}
难道他们想的是,从singleFactory.getObject()获取 bean 后不存入singletonObjects,每次都去singletonFactories获取singleFactory?
个人觉得spring要保留第二级缓存的目的是,第一级缓存只用来保存初始化完成的bean,第二级缓存只是做个缓冲,配合第三级缓存缓冲循环依赖下的代理bean。
欢迎大家讨论。。