spring中的循环依赖

2023-05-16

spring中的循环依赖

什么是循环依赖?

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

在这里插入图片描述

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

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

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

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

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

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

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

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

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

  4. 然后完成BeanB的依赖注入

    在这里插入图片描述

总结

  1. 1.spring只支持setter 注入的循环依赖。
  2. spring 通过提前暴露未完成实例化的bean的objectFactory 工厂来实现循环依赖的,这样做的目的是其他的bean 可以通过ObjectFactory 引用到该bean,在获取依赖的bean 的时候使用到了三级缓存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring中的循环依赖 的相关文章

随机推荐

  • git-cola安装与使用

    64 git cola安装与使用 linux下可视化git工具git cola安装与使用 xff08 SSH方式 xff09 链接 https blog csdn net zyhse article details 108813116
  • 家庭百兆升级千兆全攻略

    近日电信把家庭宽带给自动升成了300M xff0c 但奈何家里硬件限制 xff0c 一直都无法享受超快的速度 于是乎 xff0c 只有撸起袖子自己干 xff0c 下面来看看我的踩坑之旅吧 材料准备 千兆光猫6类以上网线 xff0c 最好带屏
  • ubuntu18.04 使用USB串口调试

    1 环境ubuntu18 04 安装了minicom环境 如果没有安装 xff0c 在执行minicom命令时会提示安装 step1 查看连接串口 gt 执行 ls dev tty Tab按键 目标串口 ttyUSB0 ttyUSB1 这个
  • STL详解及常见面试题

    文章目录 一 STL的介绍二 空间配置器详解1 第一级配置器详解2 第二级空间配置器详解3 空间配置器存在的问题 三 各种容器的特点和适用情况四 各种容器的底层机制和常见面试题1 vector xff08 1 xff09 vector的底层
  • VR中的9轴传感器(重力加速度/陀螺仪/磁力计).md

    前言 传感器的调试过程 xff0c 一般根据原厂提供demo代码 xff0c 调试数据接口 xff0c 将数据流打通即可 xff0c 在VR中 xff0c 当带上头显设备 xff0c 运行应用时 xff0c 出现漂移 延迟 不回归问题 xf
  • 数字信号处理 --- 信号分解基础

    信号的分解 重剑无锋 xff0c 大巧不工 信号的分解方式很多 xff0c 大家最常用也最熟知的就是傅里叶变换了 xff0c 然而有很多非常基础的分解方式往往不为人所知 他们的目的都是以某种方法去完美的分解并重建 还原信号 xff0c 闲来
  • leetcode系列-字符串

    字符串 xff1a 总结篇 从字符串的定义到库函数的使用原则 xff0c 从各种反转到KMP算法 什么是字符串 字符串是若干字符组成的有限序列 xff0c 也可以理解为是一个字符数组 反转系列 344 反转字符串 编写一个函数 xff0c
  • CPU种类

    CISC 1 英特尔处理器 xff1a 奔腾 赛扬 酷睿 至强 其中奔腾和赛扬系列定位低端 xff0c 酷睿系列又细分为酷睿i3 i5 i7 分别代表中端 中高端 高端 至强系列主要应用为服务器处理器 奔腾双核 xff0c 赛扬双核 xff
  • “段错误 (核心已转储) ”一种可能原因及其解决方法

    终端在运行的时候总是出现 段错误 核心已转储 栈空间用来存储数组等数据 xff0c 那么段错误就应该是我存储的数组超过了它所在段的大小 xff0c 于是在的程序执行的过程中一到跟大数组相关的步骤就会出现段错误的提示 xff08 SIGSEG
  • 统一javaweb项目和mysql数据库时间UTC时间方法及原理

    统一javaweb项目和mysql数据库时间UTC时间方法及原理 文章目录 统一javaweb项目和mysql数据库时间UTC时间方法及原理 前言UTC时间与 GMT时间时间戳和时区 mysql时间字段解读4种日期类型比如datetime和
  • 【读书笔记】《视觉SLAM十四讲(高翔著)》 第11讲

    文章目录 1 安装gtsam2 程序编译3 程序运行4 用g2o viewer打开 g2o文件 本博客的内容是本章程序编译运行方法 xff0c 记录调通本章程序的过程 处理遇到报错的解决方法 本章程序的详细解析可参考robinhjwy的CS
  • pixhawk: px4代码初学分析:追溯电机控制--pwm输出

    追溯电机控制 pwm输出 正常工作状态下pwm输出过程简述 xff1a 其他状态下pwm输出 xff1a 正常工作状态下pwm输出过程简述 xff1a 姿态解算部分得出姿态控制量通过px4io cpp把姿态控制量发送给IOIO串口读取姿态控
  • feign 调用

    关于feign调用问题 1 引入pom依赖 注释的这个依赖别用 xff0c 这个虽然不报错 xff0c 也好像可以使用 xff0c 但实际是有bug的 xff0c 会导致无法注入bean span class token operator
  • Freemarker 获取controller 传过来的值

    var val 61 entity propertyRight
  • jpa 中的联表查询

    jpa 中的联表查询 ConstructorExpression span class token generics function span class token punctuation lt span SafeOccupationa
  • LocalDate 获取当前月得第一天和最后一天

    span class token keyword public span span class token keyword static span span class token keyword void span span class
  • layui iframe 自定义按钮关闭当前窗口

    1 定义一个button 2 实现方法 formClose 61 function var index 61 parent layer getFrameIndex window name 先得到当前iframe层的索引 parent lay
  • Centos7安装Docker

    0 安装Docker Docker 分为 CE 和 EE 两大版本 CE 即社区版 xff08 免费 xff0c 支持周期 7 个月 xff09 xff0c EE 即企业版 xff0c 强调安全 xff0c 付费使用 xff0c 支持周期
  • @Async 使用和失效情况

    64 Async 使用和失效情况 因业务需要 xff0c 经常会遇到主线程中包含其他关联业务 xff0c 然关联业务的执行结果对主线程的返回结果没有直接影响或无影响 此时 xff0c 能让主线程更顺畅的执行 xff0c 并给客户带来好的客户
  • spring中的循环依赖

    spring中的循环依赖 什么是循环依赖 xff1f 循环依赖值得是bean 与bean 之间相互依赖的关系 spring是如何处理构造器注入循环依赖的 xff1f 首先Spring会走Bean的实例化流程尝试创建 A 的实例 xff0c