欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

spring中的循环依赖

时间:2023-06-12
spring中的循环依赖

什么是循环依赖?

循环依赖值得是bean 与bean 之间相互依赖的关系

spring是如何处理构造器注入循环依赖的?

首先Spring会走Bean的实例化流程尝试创建 A 的实例 ,在创建实例之间先从 “正在创建Bean池” (一个缓存Map而已)中去查找A 是否正在创建,如果没找到,则将 A 放入 “正在创建Bean池”中,然后准备实例化构造器参数 B。

Spring会走Bean的实例化流程尝试创建 B 的实例 ,在创建实例之间先从 “正在创建Bean池” (一个缓存Map而已)中去查找B 是否正在创建,如果没找到,则将 B 放入 “正在创建Bean池”中,然后准备实例化构造器参数 A。

Spring会走Bean的实例化流程尝试创建 A 的实例 ,在创建实例之间先从 “正在创建Bean池” (一个缓存Map而已)中去查找A 是否正在创建。

此时:Spring发现 A 正处于“正在创建Bean池”,表示出现构造器循环依赖,抛出异常:“BeanCurrentlyInCreationException”

spring如何处理setter 注入循环依赖的?

Spring创建BeanA,通过无参构造实例化,并暴露一个ObjectFactory,用来获取创建中的BeanA,然后把BeanA添加到“正在创建Bean池”中,然后通过setter注入BeanB

Spring创建BeanB,通过无参构造实例化,并暴露一个ObjectFactory,用来获取创建中的BeanB,然后把BeanB添加到“正在创建Bean池”中,然后通过setter注入BeanA

在BeanB通过setter注入BeanA时,由于BeanA 提前暴露了ObjectFactory ,通过它返回一个提前暴露一个创建中的BeanA。

然后完成BeanB的依赖注入

总结 1.spring只支持setter 注入的循环依赖。spring 通过提前暴露未完成实例化的bean的objectFactory 工厂来实现循环依赖的,这样做的目的是其他的bean 可以通过ObjectFactory 引用到该bean,在获取依赖的bean 的时候使用到了三级缓存。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。