在12:50秒对于移除三级缓存的解释有疑问
来源:8-2 夺取doGetBean之从缓存获取Bean
![](http://img1.sycdn.imooc.com/user/545865c30001a2d802200220-100-100.jpg)
慕哥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回答
-
同学好,三级缓存的创建逻辑得以执行的前提是singletonObject == null && allowEarlyReference
而singletonObject一旦被赋值,那么就不会在三级缓存进行创建,所以在第二缓存里面singletonObject一旦不为空,则不执行三级缓存的创建,也就是不存在重复创建了。
152021-01-15
相似问题