先说一下什么是循环依赖,Spring在初始化A的时候需要注入B,而初始化B的时候需要注入A,在Spring启动后这2个Bean都要被初始化完成
Spring的循环依赖有两种场景
1.构造器的循环依赖
2.属性的循环依赖
解决:
1.拿bean的时候先从singletonObjects(一级缓存)中获取
2.如果获取不到,并且对象正在创建中,就从earlySingletonObjects(二级缓存)中获取
3.如果还是获取不到就从singletonFactories(三级缓存)中获取,然后将获取到的对象放到earlySingletonObjects(二级缓存)中,并且将bean对应的singletonFactories(三级缓存)清除
4.bean初始化完毕,放到singletonObjects(一级缓存)中,将bean对应的earlySingletonObjects(二级缓存)清除