当前位置: 首页 > news >正文

spring如何解决循环依赖的问题

循环依赖是指一个或者多个Bean实例之间会存在直接或间接的一个依赖关系,构成循环调用。通常表现为三种形态

  1. 互相依赖:A依赖B,B依赖A

  1. 间接依赖:两个或者两个以上的Bean存在间接依赖关系,造成一个循环调用

  1. 自我依赖:自己依赖自己,造成的循环依赖

Spring框架本身也考虑了这些问题,所以设计了三级缓存解决部分循环依赖的问题。

一级缓存:存放的是完全初始化好的Bean,这个Bean可以直接被使用

二级缓存:存放的是原始的Bean的对象,这个Bean里面的属性还没有被进行赋值或者没有被依赖注入

三级缓存就是用来存放Bean工厂的一个对象,用来生成原始Bean对象,并且放入到二级缓存里面。

Spring本身只能解决单实例存在的循环引用问题,但是存在这样一种情况下需要人为去干预

实际开发过程中,出现循环依赖的根本原因其实还是在代码的设计上,因为模块的耦合度较高的情况下,依赖关系的复杂度一定会增加,我们应该尽可能得去从系统设计的角度去考虑模块之间的一个依赖关系,避免循环依赖的问题

回答方式:

Spring设计了三级缓存来解决循环依赖问题,第一级缓存里面存储完整的Bean实例,这些实例可以直接被使用,第二级缓存里面存储的实例化以后但是还没有设置属性值的Bean实例,也就是Bean里面的依赖注入还没有做,第三季缓存是用来存放Bean工厂,他主要用来生成原始Bean对象并且放在第二缓存里面,三级缓存的核心思想就是把Bean的实例化和Bean里面的依赖注入进行分离,采用一级缓存储存完整的Bean实例,采用二级缓存来存储不完整的Bean实例,通过不完整的Bean实例为突破口解决循环依赖问题,至于第三极缓存主要是解决代理对象的循环依赖问题

http://www.dtcms.com/a/25533.html

相关文章:

  • 讯方·智汇云校华为官方授权培训机构
  • 突破反爬困境:从服务端渲染到客户端SPA,爬虫环境的演变与新挑战(一)
  • Linux(Centos 7.6)命令详解:cat
  • LeetCode47
  • 【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析⑩】
  • AI服务器散热黑科技:让芯片“冷静”提速
  • linux网络编程(1.5w字+内部程序理解网络)
  • 7-Zip Final绿色版:高效压缩解压缩工具
  • 机器学些|实战?
  • 基于Java+SpringBoot+Vue的前后端分离的校园闲置物品交易网站
  • [Windows] Win7也能控制安卓手机屏幕(手机镜像投屏):scrcpy
  • PhotoShop批处理
  • Redis7——基础篇(三)
  • 3分钟了解内外网文件传输:常见方法、注意事项有哪些?
  • 【Scrapy】Scrapy教程5——第一个Scrapy项目
  • LeetCode 2080.区间内查询数字的频率:哈希表+二分查找
  • 在线OJ答题平台功能实现
  • 基于JavaWeb的公务员招考信息发布平台(源码+文档)
  • 调用openssl实现加解密算法
  • git删除本地分支
  • python继承中super() 不是简单的“调用父类”,而是调用 MRO 里的下一个类
  • LeetCode每日精进:225.用队列实现栈
  • 「pandas」Pandas 基本数据操作、 索引、赋值、排序
  • 网络工程师 (45)网际控制报文协议ICMP
  • blackbox.ai 一站式AI代理 畅享顶级模型
  • 如何使用 vxe-table grid 全配置式给单元格字段格式化内容,格式化下拉选项内容
  • MybatisPlus-扩展功能
  • Axure RP11 新功能:为设计师插上“翅膀”
  • Low code web framework for real world applications, in Python and Javascript
  • 基于SpringBoot+Vue的老年人体检管理系统的设计与实现(源码+SQL脚本+LW+部署讲解等)