Spring之循环依赖底层源码解析

2023-11-05

目录

一、循环依赖

二、解决循环依赖的思路

1、举例:AServiec依赖BService,BService依赖AService

2、循环依赖的打破

三、三级缓存解析

1、三级缓存的通常叫法:

2、三级缓存详情


一、循环依赖

1、循环依赖:很简单,就是A依赖B,B依赖A。

2、问题:在Spring中循环依赖就是一个问题了,因为在Spring中,一个对象并不是简单的new出来的,而是会经过一系列的Bean的生命周期,就是因为Bean的生命周期,所以才会出现循环依赖问题。

二、解决循环依赖的思路

如何打破这个循环,加入三级缓存。

1、举例:AServiec依赖BService,BService依赖AService

先创建AService,执行AService的生命周期

0、creatingSet<AService>,纪录是否开始创建AService对象的动作;

1、实例化Aservice--->得到一个对象--->singletonFactories<AService,lambda<AService原始对象>>;

2、填充BService属性--->去单例池中寻找BService--->Map--->没有则创建BService;

3、初始化前、初始化;

4、初始化后;

5、放入单例池。

创建BService,执行BService的生命周期

0、实例化BService--->得到一个对象--->Map<BService,BService原始对象>;

1、填充AService属性--->去单例池中找AService--->creatingSet--->出现了循环依赖--->earlySingletonObjects--->sigletonFactories--->lambda--->执行;

2、填充其他属性;

3、初始化前、初始化;

4、初始化后;

5、放入单例池。

2、循环依赖的打破

真正打破循环依赖的是三级缓存,在实例化AService后,得到一个对象,会往singletonFactories<AService,lambda<AService原始对象>>,在创建BService中填充AService属性时,在单例池中没找到AService,通过CreatingSet发现出现了循环依赖,然后会去二级缓存中寻找,二级缓存中没有找到,则在三级缓存中一定能找到,不然如果没找到就需要重新创建AService这样就又是循环依赖了肯定不合理。三级缓存也决定了二级缓存中的对象是原始对象还是代理对象。

三、三级缓存解析

1、三级缓存的通常叫法:

①、一级缓存:sigletonObjects

②、二级缓存:earlySingletonObjects

③、三级缓存:sigletonFactories

2、三级缓存详情

①、sigletonObjects:缓存经过了完整生命周期的bean;

②、earlySingletonObjects:缓存未经过完整生命周期的bean;

③、sigletonFactories:缓存的是一个ObjectFactory,也就是一个lambda表达式。在每个Bean的生成过程中,经过实例化得到一个原始对象,都会提前基于原始对象暴露一个lambda表达式,并保存到三级缓存中。sigletonObjects中,如果当前bean在依赖注入时发现出现了循环依赖,则从三级缓存中拿到lambda表达式,并执行lambda表达式得到一个对象,并把得到的对象放入二级缓存。如果当前Bean需要AOP,那么执行的lambda表达式,得到的就是对应的代理对象,如果无需AOP,则直接得到一个原始对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring之循环依赖底层源码解析 的相关文章

  • V8 如何管理它的堆?

    我知道V8的垃圾收集在工作时 会从GC的root开始追踪 这样无法到达的对象就会被标记然后被清除 我的问题是GC是如何遍历那些对象的 必须有一个数据结构来存储所有可达或不可达的对象 位图 链接表 顺便说一句 JVM 也做同样的事情吗 艾伦秀
  • Java Swing:清除JList而不触发监听器

    我的情况如下 我有一个 JList 只要在列表中进行选择 它就会触发搜索 使用 ListSelectionListener 我正在尝试使用以下命令重置列表上的选择list clearSelection 这样做的问题是使用clearSelec
  • 使用多个构造函数创建不可变类

    我正在阅读这一页 https docs oracle com javase tutorial essential concurrency imstrat html关于在 Java 中创建不可变类 并决定根据页面上概述的规范修改我正在编写的类
  • 如何在Spring的applicationContext.xml中指定默认范围来请求范围?

    我想让所有 bean 请求默认作用域 但是 Spring 文档说默认作用域是 Singleton 第 3 4 1 和 3 4 2 节http static springsource org spring docs 2 5 x referen
  • 如何解决错误:java.lang.ClassNotFoundException:io.netty.util.concurrent.GenericFutureListener?

    昨天我第一次尝试用 Java 制作 Prometheus 客户端 从 Python 开始 最后是 GoLang 是否找到示例 import io prometheus client Counter import io prometheus
  • 在气球内显示带有照片的多个地标的最佳做法是什么?

    我有一个项目如下 从手机上拍摄几张照片 将照片保存在网络系统中 然后将照片显示在其中的谷歌地球上 我读过很多文章 但它们都使用 fetchKml 我读过的一篇好文章是使用 php 但使用 fetchKml 我不知道是否可以使用 parseK
  • 删除 servlet 中的 cookie 时出现问题

    我尝试使用以下代码删除 servlet 中的 cookie Cookie minIdCookie null for Cookie c req getCookies if c getName equals iPlanetDirectoryPr
  • 业务代表与服务定位器

    Business Delegate 和 Service Locator 之间有什么区别 两者都负责封装查找和创建机制 如果 Business Delegate 使用 Service Locator 来隐藏查找和创建机制 那么 Busines
  • 如何模拟一个方面

    我目前正在使用aspectj 开发一些监控工具 因为这个工具应该是技术独立的 尽可能 所以我没有使用 Spring 进行注入 但我希望我的方面能够经过单元测试 方面示例 Aspect public class ClassLoadAspect
  • 会话 bean 中的 EntityManager 异常处理

    我有一个托管无状态会话 bean 其中注入了 EntityManager em 我想做的是拥有一个具有唯一列的数据库表 然后我运行一些尝试插入实体的算法 但是 如果实体存在 它将更新它或跳过它 我想要这样的东西 try em persist
  • LibGdx 如何使用 OrthographicCamera 滚动?

    我已经找了 10 个小时 字面意思 我已经完成了 我需要问一下 事情是我正在学习如何使用 LibGdx 来编写 Java 游戏 我正在做一个水平太空飞船游戏 所以 我最糟糕的问题是我不知道如何滚动 我认为绘制会更好地解释 我想绘制一个巨大的
  • 如何自定义JProgressBar?

    我正在制作一个启动器 我想要一个自定义的进度栏 我已经做了一些研究 并且可以使用 JavaFX 从未用它做过任何事情 并且可以通过替换 UI 来实现 我正在寻找一个具有圆形边缘和圆形填充的酒吧 像这样的事情 package gui impo
  • java JFileChooser 文件大小过滤器

    我知道我可以按文件类型进行过滤 但是可以按文件大小进行过滤吗 例如 JFileChooser 仅显示 3 MB 以内的图片 简短的回答应该是 你尝试过什么 长答案是肯定的 JFileChooser fc new JFileChooser f
  • 当容器大小更改时,JTable 仅调整选定列的大小

    对于面板内的 JTable 如果面板变大 我如何将额外的空间仅分配给某些列 在我的例子中 分配给最后一列 尽管提供 第 3 4 列和8 将获得额外的空间 我想允许用户手动更改所有列的列大小 我尝试了 table setAutoResizeM
  • 字节码和位码有什么区别[重复]

    这个问题在这里已经有答案了 可能的重复 LLVM 和 java 字节码有什么区别 https stackoverflow com questions 454720 what are the differences between llvm
  • Spring Boot中使用自定义令牌进行身份验证

    我需要保护我的 Spring Boot 应用程序 这就是我所拥有的 一个 Spring Boot 应用程序 公开了一些 REST API 与公开的 api 通信的前端 前端发送用于身份验证的自定义身份验证令牌 存储自定义身份验证令牌的数据库
  • 是什么原因导致“对象不是声明类的实例”? [复制]

    这个问题在这里已经有答案了 可能的重复 使用反射调用方法时 为什么会出现 对象不是声明类的实例 https stackoverflow com questions 7202988 why do i get object is not an
  • 监控 Java 应用程序上的锁争用

    我正在尝试创建一个小基准 在 Groovy 中 以显示几个同步方法上的高线程争用 当监控自愿上下文切换时 应该会出现高争用 在 Linux 中 这可以通过 pidstat 来实现 程序如下 class Res private int n s
  • 使用 Android 的 Mobile Vision API 扫描二维码

    我跟着这个tutorial http code tutsplus com tutorials reading qr codes using the mobile vision api cms 24680关于如何构建可以扫描二维码的 Andr
  • 如何在Java中跨类共享变量,我尝试了静态不起作用

    类 Testclass1 有一个变量 有一些执行会改变变量的值 现在在同一个包中有类 Testclass2 我将如何访问 Testclass2 中变量的更新值 由 Testclass1 更新 试过这个没用 注意 Testclass1和Tes

随机推荐

  • CUDA samples系列 0.3 vectorAdd

    目录 CPU与GPU同步方法详解 源代码中的同步 同步方法扩展 代码解析 扩展一 vectorAdd nvrtc 扩展二 vectorAddDrv 这份代码非常的简单和基础 就把两个向量相加 CPU与GPU同步方法详解 源代码中的同步 代码
  • vue动态菜单及tag切换

    刚刚接触项目的小伙伴 几乎都接触不到这一块的 因为入职 公司要么有骨干 要么是现有项目维护 所以 对于动态菜单 很好奇 今天带着小伙伴们一起来看看吧 可能有些人接触过 只是看看别人写的代码 觉得都没有问题 没有实际动手去做过 这就应对了那句
  • mock与spy的区别

    mock与spy的区别 1 mock 1 1 mock对象的方法不执行具体逻辑 1 2 使用方法打桩返回给定数据 1 3 mock如何执行具体逻辑 2 spy 2 1 spy对象的方法执行具体逻辑 2 2 spy如何不执行具体逻辑 1 mo
  • java的运行环境是什么_Java运行环境是什么

    Java运行环境 JRE 是一个软件 由太阳微系统所研发 JRE可以让计算机系统运行Java应用程序 JRE的内部有一个Java虚拟机 JVM 以及一些标准的类别函数库 Java 运行环境 Java Runtime Environment
  • 时序预测

    时序预测 Python实现NARX带外源输入的非线性自回归神经网络时间序列预测 目录 时序预测 Python实现NARX带外源输入的非线性自回归神经网络时间序列预测 效果一览 基本介绍 程序设计 参考资料 效果一览 基本介绍 Python实
  • 解决Xampp中mysql无法启动的问题

    很突然的Xampp的mysql就打不开 很疑惑 之前一直可以打开的 然后刚才我启动了一下 就突然启动不了了 我想了一下 并没有出现端口号占用问题呀 而且报错也没有说端口号占用 报错写的很是通俗 然后我查看了日志文件 发现日志文件中也没有描述
  • 【无标题】chatgpt桌面化,桌面应用的安装

    前言 关于chatgpt最近来说可算是大火 不过在我使用过程中发现没事都要上openai的官网过于麻烦 而且卡顿 于是乎就在网上寻找一些方法 发现chatgpt可以桌面化 话不多说 直接上图 1 上github找这位大佬 2 主页往下番找到
  • 测试中BUG定义、测试BUG的等级划分、Bug流程以及Bug解决优先级

    一个优秀的软件测试师不仅仅能够发现软件中的bug 还能分析出bug产生的原因 总结了一些软件测试入门必须要了解和学习的BUG基础知识 主要包括BUG定义 测试BUG的等级划分 Bug流程以及Bug解决优先级等内容 下面一起来梳理一遍这些基础
  • ISE报错NgdBuild:604解决方法

    ISE报错NgdBuild 604解决方法 在使用ISE编写FPGA代码时 从其他地方导入 v文件 运行时会报图片中的错误 解决方法 在单纯的复制黏贴 v文件并且导入到 ISE 的同时 把 ngc文件拷贝过来 如下图所示 Rerun后即可解
  • python fastapi 向页面推送视频流,网站播放python获取的rtsp视频

    代码如下 import cv2 import uvicorn from fastapi import FastAPI Response from fastapi responses import StreamingResponse 创建一个
  • ubuntu安装软件一直0%

    ubuntu安装软件一直0 下载不了东西 更新版本库也不行 可能和dns解析错误有关系 可以修改 etc resolv conf文件 我填写的是北京联通的 请自行查阅自己的 nameserver 127 0 0 53 nameserver
  • 基于SpringBoot的CSGO赛事管理系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SpringBoot 前端 采用Vue技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse
  • win11安装gcc,g++,配置c++的编译环境

    MinGW Minimalist GNU for Windows download SourceForge net 下载并安装MinGW 可以直接鼠标点击操作 简单的很 选定gcc g 为待安装环境 然后开始安装就可以了 环境变量 右键计算
  • Java笔记-I/O流之比较器接口对象数组排序

    对象数组排序 内容介绍 1 对象数组直接调用sort 方法报错的原因 是因为没有定义比较的规则 需要自己定义 2 如何定义规则 看报错信息 ClassCastException demoCompare Person cannot be ca
  • 算法复杂度

    时间复杂度和空间复杂度 N 1个操作 O n O n O n O n N 2 1个操作 1 2 O n O n 2个单位的内存空间 O 1 常数的时间复杂度 两层循环O n 2 归并排序 T n 2 T n 2 n O n log n Ma
  • 10讲学会C语言之第四讲:循环结构

    文章目录 前言 一 求pi的近似值 二 统计整数的位数 三 判断素数 四 求阶乘和 五 循环结构编程 六 作业 前言 大家好 我是卷卷 本节课讲循环结构 for while和do while 主要包括六个部分 求pi的近似值 统计整数的位数
  • 1658 页的《Java 面试突击核心讲》在牛客网火了,完整版 PDF 开放下载!

    前言 我们都知道 在程序员的职业生涯中 有多个发展方向 不过就数据表明 近年来选择架构师方向的开发人员也越来越多 对于架构师的发展前途 我相信是已经没有争议的 但这个 概念 对于很多开发人员来说 并没有太清晰的认识 怎样才能成为架构师 是很
  • IDEA安装使用 VisualVM 及VisualVM 远程监视

    1 VisualVM是什么 按照VisualVM官网 http visualvm github io 上的介绍 VisualVM是一个集成命令行JDK工具和轻量级分析功能的可视化工具 专为开发和生产时间使用而设计 我们在jdk安装包中也可以
  • nmon的安装与使用

    author skate time 2011 08 06 nmon的安装与使用 1 下载 nmon http nmon sourceforge net pmwiki php n Site Download nmonanalyser http
  • Spring之循环依赖底层源码解析

    目录 一 循环依赖 二 解决循环依赖的思路 1 举例 AServiec依赖BService BService依赖AService 2 循环依赖的打破 三 三级缓存解析 1 三级缓存的通常叫法 2 三级缓存详情 一 循环依赖 1 循环依赖 很