Spring三级缓存和对象创建

一级缓存:singletonObjects 二级缓存:earlySingletonObjects 三级缓存:singletonFactories

一级缓存是ConcurrentHashMap之外,二级缓存和三级缓存都是HashMap

存放内容

一级缓存- 存放就绪状态的Bean

二级缓存- 存放早起曝光的Bean,一般只有处于循环引用状态的Bean。保存在该缓存中的Bean 所实现Aware子接口的方法还未回调,自定义初始化方法未执行,也未经过BeanPostProcessor实现类的postProcessorBeforeInitialization、postProcessorAfterInitialization方法处理。 如果启用 AOP,并且处于切点表达式处理范围之内,那么会被增强,即创建其代理对象。

三级缓存- 用来存放创建用于获取Bean的工厂类-ObjectFactory实例。在IoC容器中,所有刚被创建出来的Bean,默认都会保存到该缓存中。

Bean流转顺序

存在循环引用
  1. 通过反射创建Bean实例。是单例Bean,并且IoC容器允许Bean之间循环引用,保存到三级缓存中。
  2. 当发生了循环引用时,从三级缓存中取出Bean对应的ObjectFactory实例,调用其getObject方法,来获取早期曝光Bean,从三级缓存中移除,保存到二级缓存中。
  3. Bean初始化完成,生命周期的相关方法执行完毕,保存到一级缓存中,从二级缓存以及三级缓存中移除。
没有循环引用
  1. 通过反射创建Bean实例。是单例Bean,并且IoC容器允许Bean之间循环引用,保存到三级缓存中。
  2. Bean初始化完成,生命周期的相关方法执行完毕,保存到一级缓存中,从二级缓存以及三级缓存中移除。

总结

Bean在一级缓存、二级缓存、三级缓存中的流转顺序为:三级缓存->二级缓存->一级缓存。

但是并不是所有Bean都会经历这个过程,例如对于原型Bean(Prototype),IoC容器不会将其保存到任何一个缓存中的,

另外即便是单例Bean(Singleton),如果没有循环引用关系,也不会被保存到二级缓存中的。

你可能感兴趣的:(spring)