0
0
SpringBoot Bean的循环依赖
文章摘要
|
循环依赖:指A依赖B,B又依赖A这样的依赖循环问题。在spring中通过DefaultSingletonBeanRegistry的三个对象缓存区解决循环依赖问题:
singletonObjects:存储实例化完成且完成依赖注入的Bean。earlySingletonObjects:存储实例化完成但未完成依赖注入的Bean。singletonFactories:存储创建Bean的ObjectFactory。
假设现在有A和B,且A依赖B,B又依赖A,则Bean的创建过程是这样的:
- 调用A的构造方法实例化A,此时A还未完成依赖注入,封装一个A的ObjectFactory并放入
singletonFactories。 - 处理A的依赖注入,但此时没有B,则调用B的构造方法实例化B,此时B还未完成依赖注入,封装一个B的ObjectFactory并放入
singletonFactories。 - 处理B的依赖注入,找到
singletonFactories中A的ObjectFactroy,调用该ObjectFactroy的getObject方法得到未完成依赖注入的A(如果需要代理对象,则会自动创建,将来得到的就是代理对象),把A(未完成依赖注入)注入给B,同时把A(未完成依赖注入)放入earlySingletonObjects,将来如果有其他类循环依赖A,则可以直接在earlySingletonObjects中找到,这样singletonFactories中A的ObjectFactroy就可以删除了。 - 至此,B的依赖注入完成,B就创建完毕了,将B的对象放入
singletonObjects,同时删除singletonFactories中B的ObjectFactroy。 - B创建完毕,继续A的依赖注入,把B注入给A,此时A也创建完毕,就可以删除
earlySingletonObjects中的A(未完成依赖注入)。 - 至此,A和B的对象都创建完毕且放入
singletonObjects中,将来通过容器获取对象都是从singletonObjects中获取。
