spring两级缓存可以解决循环依赖吗?

发布时间 2023-03-30 17:39:19作者: 少侠砍人不用刀

                概念理解:

                spring的三级缓存

1层 singletonObjects 第一级缓存,存放可用的成品Bean
2层 earlySingletonObjects 第二级缓存,存放半成品的Bean半成品的Bean是已创建对象,但是未注入属性和初始化。用以解决循环依赖。
3层 singletonFactories 第三级缓存,存的是Bean工厂对象,用来生成半成品的Bean并放入到二级缓存中。用以解决循环依赖。

              

              问:两级缓存可以解决循环依赖吗?(只有第一级和第二级的缓存可以解决循环依赖吗) 

              答:如果不使用第三级缓存(指不使用工厂模式返回对象,而是直接返回一个早期对象/代理早期对象放入第二级缓存中);
                意味着Bean在构造完后就创建代理对象,这样违背了Spring设计原则。Spring结合AOP跟Bean的生命周期,是在Bean创建完全之后                                                                           通过AnnotationAwareAspectJAutoProxyCreator这个后置处理器来完成的,在这个后置处理的postProcessAfterInitialization方法中对初始化后的Bean完成AOP代理。                                                                                             如果出现了循环依赖,那没有办法,只有给Bean先创建代理,但是没有出现循环依赖的情况下,设计之初就是让Bean在生命周期的最后一步完成代理而不是在实例化                                                          后就立马完成代理。 

 

              问:可以去掉第二级缓存吗(只有第一级和第三级的缓存)

              答:去掉第二级缓存会在 a依赖b,c   ;bc依赖a   这样的多循环的时候 ,每次从工厂返回的早期对象/早期代理对象 不唯一,导 致b和c引用的a早期对象不是同一个

                

               总结:1.两级缓存是可以解决循环依赖的,违反spring的设计原则;

                  2.去掉第二级缓存会导致可能通过工厂get出来的早期对象不一致,不能保证单例;