在12:50秒对于移除三级缓存的解释有疑问

来源:8-2 夺取doGetBean之从缓存获取Bean

慕哥6062902

2020-06-24

//将实例放入二级缓存里
this.earlySingletonObjects.put(beanName, singletonObject);
//从三级缓存里移除
this.singletonFactories.remove(beanName);

老师,我的看法是(我没有去仔细再看源码,仅仅是从您的讲解中,有些疑问) : 最上面两行代码“是从三级缓存移除该bean,只在二级缓存中保存该bean实例”,这个我能理解。我有疑问的地方是您说防止通过singletonFactory去重复创建bean实例。第一行代码已经放到二级缓存了,就表示下次在二级缓存可以拿到这个bean实例。此时

//如果还没有获取到并且第二个参数为true,为true则表示bean允许被循环引用
	if (singletonObject == null && allowEarlyReference) {
//从三级缓存singletonFactories这个ObjectFactory实例的缓存里尝试获取创建此Bean的单例工厂实例}

这段代码它根本进不来啊,就是说它不会去找三级缓存了,所以不存在重复创建的说法啊。想问下这里是还有什么逻辑没讲完全,还是我理解有误。

写回答

1回答

翔仔

2020-06-25

同学好,三级缓存的创建逻辑得以执行的前提是singletonObject == null && allowEarlyReference

而singletonObject一旦被赋值,那么就不会在三级缓存进行创建,所以在第二缓存里面singletonObject一旦不为空,则不执行三级缓存的创建,也就是不存在重复创建了。

1
5
N十1
这里我也没有听懂,因为 1.我看着是 二级缓存中存储的不是singletonFactory,而是他包装的singleObject也就是对象的实例,所以是不是“才能避免我们从二级缓存中获取singletonFactory“这句话是不是不正确呀? 2. 接下来的一句话“然后再调用getObject()来重复创建bean实例”这样怎么就重复创建bean实例了呢? 3. 从三级缓存获取的singletonObject已经放入了二级缓存,也就是if(singletonObject == null && allowEarlyReference){...} 这段代码块不再执行了,不清除三级缓存怎么就造成重复创建bean实例了呢
2021-01-15
共5条回复

剑指Java自研框架,决胜Spring源码

快速入门Spring核心源码+从零开发自研框架

1498 学习 · 495 问题

查看课程