spring的循环依赖、三级缓存
二级缓存可处理循环依赖、三级缓存处理代理
1、A、B两个类 ,循环依赖,无代理
A在创建时,将早期工厂放在三级缓存,并生成一个早期BeanA,在属性注入时发现需要B,此时去生成B
B通过三级缓存的早期工厂创建早期BeanB,注入属性是发现需要A,此时获取早期BeanA,并完成B的初始化
A在B初始化后,完成创建。
2、A、B两个类 ,循环依赖,有代理
A在创建时,将早期工厂放在三级缓存,并生成一个早期BeanA(代理),在属性注入时发现需要B,此时去生成B
B通过三级缓存的早期工厂创建早期BeanB,注入属性是发现需要A,此时获取早期BeanA(代理),并完成B的初始化
A在B初始化后,完成创建
二级缓存能够解决循环依赖。但是当存在代理时,如果只有二级缓存,由于每次向外部都需要提供同一个代理,
要么,使用二级缓存存储代理对象,三级缓存存工厂
要么,直接使用二级缓存存储代理对象,不要工厂。
注意:
1、除去代理的情况,如果A、C也存在循环依赖,那么C在获取A时,该A需要和B获取到的A相同,所以直接从二级缓存拿即可。
2、正常来讲,bean的代理是在属性注入后,如果存在循环依赖,该代理过程会提前。