第一级缓存:singletonObjects
存放已经完完全全创建好的 Bean,什么叫完完全全创建好的?就是上面说的是,所有的
步骤都处理完了,就是创建好的 Bean。一个 Bean 在产的过程中是需要经历很多的步骤,在
这些步骤中可能要处理@Autowired 注解,又或是处理@Transcational 注解,当需要处理的
都处理完之后的 Bean,就是完完全全创建好的 Bean,这个 Bean 是可以用来使用的,我们
平时在用的 Bean 其实就是创建好的。
第二级缓存:earlySingletonObjects
早期暴露出去的 Bean,其实也就是解决循环依赖的 Bean。早期的意思就是没有完完全全
创建好,但是由于有循环依赖,就需要把这种 Bean 提前暴露出去。其实 早期暴露出去的
Bean 跟 完完全全创建好的 Bean 他们是同一个对象,只不过早期 Bean 里面的注解可能还
没处理,完完全全的 Bean 已经处理了完了,但是他们指的还是同一个对象,只不过它们是
在 Bean 创建过程中处于的不同状态,如果早期暴露出去的 Bean 跟完完全全创建好的 Bean
不是同一个对象是会报错的,项目也就起不来,这个不一样导致报错问题,这里我会结合一
个案例再来写一篇文章,这里不用太 care,就认为是一样的。
第三级缓存:singletonFactories
存的是每个 Bean 对应的 ObjectFactory 对象,通过调用这个对象的 getObject 方法,就可
以获取到早期暴露出去的 Bean。
注意:这里有个很重要的细节就是三级缓存只会对单例的 Bean 生效,像多例的是无法利
用到三级缓存的,通过三级缓存所在的类名 DefaultSingletonBeanRegistry 就可以看出,仅仅
是对 SingletonBean 也就是单例 Bean 有效果。