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

1、概述

spring中,存在A依赖B,同时B又依赖A的情况,这种情况下,spring如何进行bean初始化呢?

java 复制代码
@Service
public class A {
    @Autowired
    private B b;
}

@Service
public class B {
    @Autowired
    private A a;
}

本文来解释这个问题。

2、spring的应对之道

2.1 三级缓存介绍

Spring 框架在解决单例 Bean 的循环依赖问题时,使用了三级缓存机制。这三级缓存分别是:

  • 一级缓存(singletonObjects)
  • 二级缓存(earlySingletonObjects)
  • 三级缓存(singletonFactories)

每级缓存都有其特定的作用,下面详细解释这三级缓存的作用:

  1. 一级缓存 (singletonObjects)

作用:存储完全初始化好的 Bean 实例。

特点:当一个 Bean 完全初始化并准备好使用时,会被放入 singletonObjects 缓存中。

访问时机:当其他 Bean 需要依赖这个 Bean 时,会直接从 singletonObjects 中获取。

  1. 二级缓存 (earlySingletonObjects)

作用:存储部分初始化的 Bean 实例。

特点:当一个 Bean 正在创建过程中,但还没有完全初始化完毕时,会被放入 earlySingletonObjects 缓存中。

访问时机:当其他 Bean 需要依赖这个正在创建中的 Bean 时,会从 earlySingletonObjects 中获取部分初始化的实例。

  1. 三级缓存 (singletonFactories)

作用:存储创建 Bean 的工厂对象。

特点:当一个 Bean 正在创建过程中,Spring 会将创建这个 Bean 的工厂对象放入 singletonFactories 缓存中。

访问时机:当其他 Bean 需要依赖这个正在创建中的 Bean 时,会从 singletonFactories 中获取工厂对象,并通过工厂对象获取部分初始化的实例

2.2 bean初始化过程

上述创建过程中有一些疑问:

  • 第三步的B依赖的是A1,A1是部分创建成功的,也就是B也是部分创建成功的,那为什么B能放在一级缓存中呢,放在一级缓存中意味着B是可以被使用的。
  • 第四步:A创建后,A1的状态是什么样的?
  • 第四步:B之前依赖的是A1,如何把依赖更新到A上的?
相关推荐
Ting-yu1 分钟前
SpringCloud快速入门(5)---- 均衡负载
java·spring·spring cloud
学不思则罔18 分钟前
ParallelStream并发陷阱解析
java·开发语言·windows
小江的记录本18 分钟前
【AI大模型选型指南】《2026年5月(最新版)国内外主流AI大模型选型指南》(个人版)
前端·人工智能·后端·ai·aigc·ai编程·ai写作
认真的小羽❅21 分钟前
【Java并发编程】volatile关键字深度解析:从内存语义到实际应用
java·开发语言
@PHARAOH32 分钟前
HOW - 前端输入场景支持拼音匹配
前端
奋斗的小乌龟36 分钟前
langchain4j笔记-08
java·spring boot·笔记
leonidZhao39 分钟前
Java25新特性:加密对象的PEM编码
java
计算机安禾41 分钟前
【c++面向对象编程】第21篇:运算符重载基础:语法、规则与不可重载的运算符
java·前端·c++
萧曵 丶43 分钟前
JUC 实际业务高频面试题浅谈
java·juc·aqs·lock
初圣魔门首席弟子1 小时前
bug 2026.05.15(以前能运行的java springboot项目突然间不能运行后台数据了)
java·开发语言·bug