spring如何解决循环依赖问题
1、 什么是循环依赖问题
-
循环依赖问题就是A->B->A,spring在创建A的时候,发现需要依赖B,因为去创建B实例,发现B又依赖于A,又去创建A,因为形成一个闭环,无法停止下来就可能会导致cpu计算飙升。
-
解决方法:Spring的三级缓存(3个map)。
Spring在初始化A时,进行到第(4)步要为属性B注入依赖时,先暂停A的初始化,去创建B的实例,此时生成A bean的工厂放在三级缓存中(标记为“创建中”)。初始化B时,发现B需要注入一个A的依赖(发生了循环依赖),则B可以依次遍历三级缓存,最后在第三极缓存找到了A对象,提前生成A的aop代理,存入二级缓存,同时移除三级缓存,然后A的aop代理的引用注入A,完成B的初始化。(b在初始化过程中已经生成了aop代理——Bean初始化的正常步骤,初始化完成之后,存入了一级缓存)。最后回到A的初始化,最终A也完成初始化,皆大欢喜!
2、三级缓存
- (1)第一级缓存:singletonObjects,主要存放初始化完成后的单例bean。
- (2)第二级缓存:earlySingletonObjects,主要存放经过了实例化,但并未初始化的对象。