关于spring:Spring三级缓存和对象创建

3次阅读

共计 880 个字符,预计需要花费 3 分钟才能阅读完成。

一级缓存: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),如果没有循环援用关系,也不会被保留到二级缓存中的。

正文完
 0