栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring中的循环依赖

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring中的循环依赖

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 的时候使用到了三级缓存。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/736610.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号