首先我们三重缓存应该是逻辑上的三重而不是物理上的三重。比如说其实我们可以只使用一个map就可以实现三重缓存,而不用使用三个map。
首先,第一层缓存是必须存在的,因为它用来存放bean对象。
那么第二层缓存呢。
第二层缓存叫earlySingletonObjects,是用来存放早期对象的。早期对象也就是半成品对象,spring利用半成品对象来提前暴露对象,从而解决循环依赖问题。具体可以看上一篇博客。
那第三层缓存呢
在解决循环依赖的过程中三重缓存的作用是存放一个lamda表达式,这个表达式的作用是把半成品bean放入二层缓存。那么我们为什么不直接把半成品bean放入第二层缓存,而是要新建一个三层缓存呢。
其实是为了解决代理对象的问题。
这里做了一个判断,判断是否实现了后置处理器,如果实现了就加工bean
它有一个实现类叫autoProxy,自动代理,可以自动创建代理对象。
去掉三层缓存的话,spring的bean就只能存放普通bean而不能存放代理bean了。
至于为什么需要使用lamda表达式。是利用了lamda表达式延迟实现的特性。只有当你开始属性注入时,你才能知道这个bean是不是需要代理。而lamda表达式刚好是调用了采取创建bean。而不是提前把bean放入缓存。
所以不改变执行顺序的前提下三层缓存不能缺少,但是如果改变逻辑,没创建一个早期对象就创建一个代理对象就可以省去一层缓存,但得不偿失,没有必要