共计 880 个字符,预计需要花费 3 分钟才能阅读完成。
一级缓存:singletonObjects 二级缓存:earlySingletonObjects 三级缓存:singletonFactories
一级缓存是 ConcurrentHashMap 之外,二级缓存和三级缓存都是HashMap
寄存内容
一级缓存 - 寄存就绪状态的 Bean
二级缓存 - 寄存早起曝光的 Bean,个别只有处于循环援用状态的 Bean。保留在该缓存中的 Bean 所实现 Aware 子接口的办法还未回调, 自定义初始化办法未执行,也未通过 BeanPostProcessor 实现类的 postProcessorBeforeInitialization、postProcessorAfterInitialization 办法解决。如果启用 AOP,并且处于切点表达式解决范畴之内,那么会被加强,即创立其代理对象。
三级缓存 - 用来寄存创立用于获取 Bean 的工厂类 -ObjectFactory 实例。在 IoC 容器中,所有刚被创立进去的 Bean,默认都会保留到该缓存中。
Bean 流转程序
存在循环援用
- 通过反射创立 Bean 实例。是单例 Bean,并且 IoC 容器容许 Bean 之间循环援用,保留到三级缓存中。
- 当产生了循环援用时,从三级缓存中取出 Bean 对应的 ObjectFactory 实例,调用其 getObject 办法,来获取晚期曝光 Bean,从三级缓存中移除,保留到二级缓存中。
- Bean 初始化实现,生命周期的相干办法执行结束,保留到一级缓存中,从二级缓存以及三级缓存中移除。
没有循环援用
- 通过反射创立 Bean 实例。是单例 Bean,并且 IoC 容器容许 Bean 之间循环援用,保留到三级缓存中。
- Bean 初始化实现,生命周期的相干办法执行结束,保留到一级缓存中,从二级缓存以及三级缓存中移除。
总结
Bean 在一级缓存、二级缓存、三级缓存中的流转程序为:三级缓存 -> 二级缓存 -> 一级缓存。
然而并不是所有 Bean 都会经验这个过程,例如对于原型 Bean(Prototype),IoC 容器不会将其保留到任何一个缓存中的,
另外即使是单例 Bean(Singleton),如果没有循环援用关系,也不会被保留到二级缓存中的。
正文完