Spring 循环依赖问题的解决方法

Spring通过三级缓存解决了循环依赖。

  • singletonObjects:一级缓存,存储的是所有创建好了的单例Bean
  • earlySingletonObjects:二级缓存,存储的是完成实例化,但是还未进行属性注入及初始化的对象
  • singletonFactories:三级缓存,存储的是提前暴露的一个单例工厂,二级缓存中存储的就是从这个工厂中获取到的对象

当A、B两个类发生循环引用时,在A完成实例化后,就使用实例化后的对象去创建一个对象工厂,添加到三级缓存中,如果A被AOP代理,那么通过这个工厂获取到的就是A代理后的对象,如果A没有被AOP代理,那么这个工厂获取到的就是A实例化的对象。

当A进行属性注入时,会去创建B,同时B又依赖了A,所以创建B的同时又会去调用getBean(a)来获取需要的依赖,此时的getBean(a)会从缓存中获取:

第一步:先获取到三级缓存中的工厂;

第二步:调用对象工厂的getObject方法来获取到对应的对象,得到这个对象后将其注入到B中。紧接着B会走完它的生命周期流程,包括初始化、后置处理器等。

第三步:当B创建完后,会将B再注入到A中,此时A再完成它的整个生命周期。至此,循环依赖结束!

只使用二级缓存能否解决循环依赖问题?

答案是不能的!如果要使用二级缓存解决循环依赖,意味着所有Bean在实例化后就要完成AOP代理,这样违背了Spring设计的原则,Spring在设计之初就是通过AnnotationAwareAspectJAutoProxyCreator这个后置处理器来在Bean生命周期的最后一步来完成AOP代理,而不是在实例化后就立马进行AOP代理。

你可能感兴趣的:(#,Spring系列框架,循环依赖)