首先你要搞清楚什么是循环依赖 ,用一段代码来说明吧
class A{a.set(B b)
}
class { b.set(A a)
}
这样无限制循环下去很容易造成内存溢出
这时候spring解决循环依赖的方法是:运用三个map
map1:singletonObjects
map2:earlySingletonObjects
map3:singletonFactoies
这里我们脑海里要有一个清晰的流程就是:要知道spring获取一个bean的大概流程,
getBean -> dogetBean -> createBean -> doCreateBean
在创建Bean的过程存在三个步骤
1、ceateBeanInstance
2、populateBean
3、innitializeBean
上图中如果检测到了循环依赖,会把创建单例对象中的依赖对象先创建出来
代码走到这里的时候,A中所依赖的B对象已经在earlySingletonObjects中,之后在getSingleton时候就可以拿到bean对象
此时A拿到B,顺利完成初始化,然后这时候因为B中持有对A的引用,所以这时候B再拿到A的对象也顺利完成了初始化