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

相关推荐
2401_897930064 分钟前
Maven 使用教程
java·maven
PXM的算法星球15 分钟前
【Java后端】MyBatis 与 MyBatis-Plus 如何防止 SQL 注入?从原理到实战
java·sql·mybatis
zh_xuan19 分钟前
java Optional
java·开发语言
阿杜杜不是阿木木26 分钟前
03.使用spring-ai玩转MCP
java·人工智能·spring boot·spring·mcp·spring-ai
旧故新长30 分钟前
MyBatis 类型处理器(TypeHandler)注册与映射机制:JsonListTypeHandler和JsonListTypeHandler注册时机
java·开发语言·mybatis
异常君40 分钟前
Redis 中的概率过滤器:布隆过滤器与布谷鸟过滤器实战对比
java·redis·后端
胡子发芽41 分钟前
请解释Java中的逃逸分析(Escape Analysis)及其对性能的影响,并说明如何通过JVM参数来控制逃逸分析的行为
java
Stimd43 分钟前
【重写SpringFramework】声明式事务上:构建事务切面(chapter 4-5)
java·后端·spring
码熔burning43 分钟前
【MQ篇】RabbitMQ之消息持久化!
java·分布式·rabbitmq·mq
南客先生1 小时前
深入解析:RocketMQ、RabbitMQ和Kafka的区别与使用场景
java·kafka·消息队列·rabbitmq·rocketmq