spring三级缓存

三级缓存的原因:

Spring针对代理的设计原则是:先实例化原对象,原对象的依赖完成注入,然后在创建代理对象。

比如BeanA依赖BeanB,BeanA有代理对象:BeanA_Proxy。

情况1: BeanB不依赖BeanA_Proxy,即没有循环依赖,则Bean依赖注入流程如下:

BeanA实例化生成原对象,依赖BeanB,BeanB实例化&初始化&代理化,BeanA完成依赖注入,生成BeanA的代理对象BeanA_Proxy。流程比较简单,不用三级缓存也能搞定。

 

情况2: BeanB又反过来依赖BeanA,即BeanA_Proxy。

这种情况BeanA实例化生成原对象,依赖BeanB,BeanB实例化后依赖注入时需要BeanA_Proxy,由于Spring针对代理的设计原则是(先实例化原对象,原对象的依赖完成注入,然后在创建代理对象。)这时还有没有BeanA_Proxy,因此针对这种循环依赖的场景,就不能按刚说的原则走了,这时就需要先临时创建好BeanA_Proxy,注意这个只是临时创建的BeanA_Proxy,是位于earlyProxyReferences中的。BeanB依赖注入完成后,就可以被BeanA注入了,BeanA完成依赖注入后,继续走后续的代理化流程,这时会检查earlyProxyReferences缓存,如果有那大概率有循环依赖,被提前创建好了,直接取就行(方式重复代理化)。

 

 

 https://segmentfault.com/a/1190000023647227

https://www.cnblogs.com/youzhibing/p/14337244.html

https://cdmana.com/2021/05/20210506094345939j.html

 

posted @ 2021-08-12 20:39  iamswf  阅读(227)  评论(0编辑  收藏  举报