spring去掉第二级缓存

先看网上的回到

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。

欢迎大家讨论。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值