spring中解决循环依赖的方法

embedded/2025/1/31 14:54:41/

为了避免这种循环依赖问题,Spring 引入了三级缓存的机制,分为:

  1. 一级缓存singletonObjects):这是存放已经完全创建好的单例 Bean 的缓存。当 Bean 完全初始化并且可以被使用时,会存放在这里。

  2. 二级缓存earlySingletonObjects):这是一个存放 Bean 的“早期引用”的缓存。它保存的是那些已经实例化但是还没有完全初始化完成的 Bean(例如,还没有设置完所有依赖的 Bean)。这个缓存用于解决 Bean 依赖于自己的问题。

  3. 三级缓存singletonFactories):这是存放 ObjectFactory 的缓存,它实际上是一个工厂,用来生成 Bean 实例。当 Spring 创建 Bean 时,会先将一个 ObjectFactory 放入这个缓存中,这个工厂在被调用时会返回一个正在创建的 Bean 的实例。

注意,这里二级缓存中的早期引用,是解决循环依赖的关键。早期引用就是指一个 Bean 在刚被实例化,没初始化之前,Spring 会将它放入二级缓存中,以便其他 Bean 在需要的时候能够提前依赖它。

Spring 会将 AB 都放入一级缓存(singletonObjects),表示它们已经完全初始化,可以正常使用


http://www.ppmy.cn/embedded/158381.html

相关文章

GPMC介绍

一、GPMC并口简介 GPMC(General Purpose Memory Controller)是TI处理器特有的通用存储器控制器接口,是AM335x、AM437x、AM5708、AM5728等处理器专用于与外部存储器设备的接口,如: ● 异步SRAM内存和专用集成电路(ASIC)设备。 ● 异步&…

Microsoft Visual Studio 2022 主题修改(补充)

Microsoft Visual Studio 2022 透明背景修改这方面已经有很多佬介绍过了,今天闲来无事就补充几点细节。 具体的修改可以参考:Microsoft Visual Studio 2022 透明背景修改(快捷方法)_material studio怎么把背景弄成透明-CSDN博客文…

【memgpt】letta 课程5:可编程的agent内存

Programming Agent Memory 基本上是内存和内存块的部分。其中每个块都对应于某种字符限制。限制定义了当前块可以用掉多少上下文窗口。该块还有一个标签:

文件(c语言文件流)

前言 什么是文件,文件就是存储在磁盘(硬盘)的文件。在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(文件功能的角度来分类) 程序文件包括源程序文件(后缀为.c&#xff0…

python flask 使用 redis写一个例子

下面是一个使用Flask和Redis的简单例子: from flask import Flask from redis import Redisapp Flask(__name__) redis Redis(hostlocalhost, port6379)app.route(/) def hello():# 写入到Redisredis.set(name, Flask Redis Example)# 从Redis中读取数据name re…

虚幻基础10:isValid

能帮到你的话,就给个赞吧 😘 文章目录 isValid isValid 节点:检测资产,防止游戏崩溃。

rsync安装与使用-linux015

使用 rsync 可以非常高效地将文件或目录从一个服务器传输到另一个服务器。 能力: 支持 64 位文件、64 位 inode、64 位时间戳、64 位长整型支持套接字对、符号链接、符号链接时间、硬链接、硬链接特殊文件、硬链接符号链接支持 IPv6、访问时间(atimes&…

【某大厂一面】ThreadLocal如何实现主子线程之间的数据同步

ThreadLocal 是 Java 中用于实现线程本地存储的类,它为每个线程提供独立的变量副本,确保线程间的数据隔离。然而,ThreadLocal 本身并不直接支持主子线程之间的数据同步。要实现主子线程之间的数据同步,可以结合 InheritableThread…