Spring如何解决循环依赖

目录

概述

三级缓存机制

Spring无法解决的循环依赖


概述

循环依赖也叫循环引用,是指bean之间形成相互依赖的关系,由此,bean对象在属性注入时便会产生循环。这种循环依赖会导致编译器无法编译代码,从而无法运行程序。为了避免循环依赖,我们在开发过程中需要避免类之间的过度耦合,使用接口和抽象类来降低类之间的依赖性,同时避免在类的构造函数中创建依赖的对象。循环依赖如下图所示:

我们把这个流程放到Bean的生命周期中去看一下

当然这种依赖不仅仅在两个bean对象中产生,也可能会发生在一个或多个bean对象中。

Spring通过三级缓存机制解决循环依赖问题,下文详细介绍。

三级缓存机制

Spring的三级缓存机制指的是在 Spring 容器中创建 bean 对象时,Spring 容器在创建过程中会维护三个缓存区,分别是 Singleton 缓存区、Early Singleton 缓存区和 Factory Bean 缓存区。

一级缓存(singletonObjects):用于保存实例化,注入,初始化完成的bean,一级缓存中的bean对象是完整的可供使用的bean对象

二级缓存(earlySingletonObjects):用于保存实例化完成的bean对象,此时的bean对象,可能被一个或多个bean依赖。

三级缓存(singletonFactories):用于保存实例化完成,但未初始化的bean,此时的bean对象无法使用。

Spring无法解决的循环依赖

1.多例Bean通过setter注入的情况,不能解决循环依赖问题

2.构造器注入的Bean的情况,不能解决循环依赖问题

3.单例的代理Bean通过Setter注入的情况,不能解决循环依赖问题

4.设置了@DependsOn的Bean的情况,不能解决循环依赖问题

相关推荐
超梦dasgg9 分钟前
Java 生产环境 MQ 技术选型全解析
java·开发语言·java-rocketmq·java-rabbitmq
霸道流氓气质9 分钟前
Spring AI 多工具链式调用(Tool Chain)极简实战
java·人工智能·spring
罗超驿1 小时前
22.深入剖析JDBC架构:从原生API到企业级数据交互核心
java·数据库·mysql·面试
一直有一个ac的梦想1 小时前
cmu15445 2025fall lec 18 transactions with two-phase lock
java·开发语言·数据库
九皇叔叔1 小时前
Spring-Ai-Alibaba [04] 04-llm-platform-custom-demo
java·人工智能·spring
技术路上的探险家1 小时前
Sa-Token 单点登录(SSO)三种模式大白话详解:告别重复登录
java·sa-token·单点登录·sso
JAVA社区1 小时前
Java进阶全套教程(四)—— SpringMVC框架详解
java·开发语言·spring·面试·职场和发展
ㄣ知冷煖★1 小时前
统一网关架构实践:从 Token 鉴权到路由、策略与凭证池转发全链路解析
java·服务器·架构
Lumbrologist1 小时前
【C++】零基础入门 · 第 2 节:变量、基本数据类型与输入输出
java·开发语言·c++
GISer_Jing1 小时前
Three.JS渲染架构解读
java·javascript·架构