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实例为突破口解决循环依赖问题,至于第三极缓存主要是解决代理对象的循环依赖问题

相关推荐
桦说编程3 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
lifallen3 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研3 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
没有bug.的程序员3 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
一只爱撸猫的程序猿3 小时前
使用Spring AI配合MCP(Model Context Protocol)构建一个"智能代码审查助手"
spring boot·aigc·ai编程
甄超锋4 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
阿华的代码王国4 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Zyy~4 小时前
《设计模式》装饰模式
java·设计模式
A尘埃4 小时前
企业级Java项目和大模型结合场景(智能客服系统:电商、金融、政务、企业)
java·金融·政务·智能客服系统
青云交5 小时前
Java 大视界 -- 基于 Java 的大数据可视化在城市交通拥堵治理与出行效率提升中的应用(398)
java·大数据·flink·大数据可视化·拥堵预测·城市交通治理·实时热力图