解决循环依赖报错问题
Caused by:
org.springframework.beans.factory.BeanCurrentlyInCreationException:
Error creating bean with name ‘asyncTaskServiceImpl’: Bean with name
‘asyncTaskServiceImpl’ has been injected into other beans
[resignServiceImpl] in its raw version as part of a circular
reference, but has eventually been wrapped. This means that said other
beans do not use the final version of the bean. This is often the
result of over-eager type matching - consider using
‘getBeanNamesForType’ with the ‘allowEagerInit’ flag turned off, for
example.at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:649)
这个错误是由于 Spring 容器中的 循环依赖(circular dependency)问题引起的。asyncTaskServiceImpl 这个 bean 被注入到 resignServiceImpl 中时,出现了原始版本的 asyncTaskServiceImpl,而在最终完成创建时,它被包装过了,导致 resignServiceImpl 没有得到 asyncTaskServiceImpl 的最终版本。
详细分析
Spring 在处理依赖注入时,如果发现存在循环依赖,会尝试通过提前暴露一个原始对象(通常是代理对象)来解决循环引用问题。这时候,依赖的 bean 还没有完全创建完成,因此它会以 “原始” 版本暴露给依赖它的 bean,等到循环依赖关系解决后,Spring 会最终完成所有的 bean 初始化和代理包装。
但是,错误提示中指出,asyncTaskServiceImpl 被注入到 resignServiceImpl 中时是原始版本,而在依赖注入完成后,asyncTaskServiceImpl 被包装(通常是代理),这导致了 resignServiceImpl 使用了一个不完整或不期望的版本。最终的结果是,resignServiceImpl 并没有得到 asyncTaskServiceImpl 的最终版本。
可能的解决方法:
1. 使用 @Lazy 注解(使用这种方式就可以的)
可以使用 @Lazy 注解来延迟 asyncTaskServiceImpl 的初始化,避免在容器启动时过早创建 asyncTaskServiceImpl。
@Autowired
@Lazy
private AsyncTaskService asyncTaskServiceImpl;
这样 Spring 在注入时不会立即创建 asyncTaskServiceImpl,而是等到第一次使用时再创建,从而避免了循环依赖。
2. 避免构造函数注入中的循环依赖
如果是通过构造函数注入引起的循环依赖,可以考虑将注入方式改为字段注入(@Autowired)或 setter 注入。构造函数注入时,Spring 无法绕过循环依赖问题,而字段注入和 setter 注入会延迟创建对象,可能能够避免循环依赖。
// 将构造函数注入改为字段注入
@Autowired
private AsyncTaskService asyncTaskServiceImpl;
或者使用 setter 注入:
@Autowired
public void setAsyncTaskService(AsyncTaskService asyncTaskServiceImpl) {this.asyncTaskServiceImpl = asyncTaskServiceImpl;
}
- 使用 @PostConstruct 初始化
如果注入的服务之间有依赖关系,可以考虑在 @PostConstruct 方法中进行初始化,而不是通过构造函数或字段注入直接注入。
@PostConstruct
public void init() {// 在这里进行依赖注入的逻辑,避免循环依赖问题
}
- 使用 @Primary 和 @Qualifier 明确注入
如果有多个候选的 bean 可能导致依赖注入时的冲突,可以使用 @Primary 和 @Qualifier 注解明确指定哪个 bean 应该被注入。
5. 重构代码,避免循环依赖
循环依赖通常是设计上的问题。可以考虑重构代码,将部分依赖提取到不同的服务中,打破循环依赖。比如,使用事件机制、消息队列或者中介者模式来解耦服务之间的依赖关系。
6. 调整 @Bean 配置
如果是通过 @Configuration 类配置 bean,确保避免在同一类中直接引用互相依赖的 bean。可以使用 @Lazy 或调整配置方式来避免循环依赖。
总结:
这个错误的核心问题是循环依赖,导致在依赖注入时,某些 bean 被注入了未完成初始化的“原始版本”。可以通过延迟初始化(@Lazy)、使用 setter 注入或重构代码来打破循环依赖,解决这个问题。如果可能,最好重构服务的设计,以避免这种依赖关系。
相关文章:
解决循环依赖报错问题
Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name ‘asyncTaskServiceImpl’: Bean with name ‘asyncTaskServiceImpl’ has been injected into other beans [resignServiceImpl] in its raw version as part…...

代码随想录第46期 单调栈
这道题主要是单调栈的简单应用 class Solution { public:vector<int> dailyTemperatures(vector<int>& T) {vector<int> result(T.size(),0);stack<int> st;st.push(0);for(int i1;i<T.size();i){if(T[i]<T[st.top()]){st.push(i);}else{wh…...

中仕公考怎么样?事业编面试不去有影响吗?
事业编考试笔试已经通过,但是面试不去参加会有影响吗? 1. 自动放弃面试资格:未能按时出席事业单位的面试将被视为主动放弃该岗位的竞争机会。 2. 个人信誉问题:面试作为招聘流程的关键步骤,无故缺席可能被解释为诚信…...

OMV7 树莓派 tf卡安装
升级7之后,问题多多,不是docker不行了,就是代理不好使 今天又重装了一遍,用官方的链接,重新再折腾一遍…… 使用raspberry pi imager安装最新版lite OS。 注意是无桌面 Lite版 配置好树莓派初始化设置࿰…...
Go语言24小时极速学习教程(五)Go语言中的SpringMVC框架——Gin
作为一个真正能用的企业级应用,怎么能缺少RESTful接口呢?所以我们需要尝试在Go语言环境中写出我们的对外接口,这样前端就可以借由Gin框架访问我们数据库中的数据了。 一、Gin框架的使用 1. 安装 Gin 首先,你需要在你的 Go 项目…...
【汇编】c++游戏开发
由一起学编程创作的‘C/C项目实战:2D射击游戏开发(简易版), 440 行源码分享来啦~’: C/C项目实战:2D射击游戏开发(简易版), 440 行源码分享来啦~_射击c-CSDN博客文章浏览…...

Android Studio | 修改镜像地址为阿里云镜像地址,启动App
在项目文件的目录下的 settings.gradle.kts 中修改配置,配置中包含插件和依赖项 pluginManagement {repositories {maven { urluri ("https://www.jitpack.io")}maven { urluri ("https://maven.aliyun.com/repository/releases")}maven { urlu…...

Rocky linux8 安装php8.0
Rocky linux8 安装php8.0 1.安装remi源2.列出php版本3.变更php版本,Rocky8有提供php8版本,所以切换Rocky8提供的版本,而不是remi提供的版本,不过remi有提供php8.1和php8.2版本。4.切换成remi提供的8.0版本5.安装phpendl 1.安装rem…...

Ubuntu 18 EDK2 环境编译
视频:在全新的Ubuntu上从零搭建UEFI的EDK2开发环境 开始:git clone https://github.com/tianocore/edk2.git 开始编译BaseTools前先更新一下子模块:git submodule update --init ,然后:make -C BaseTools/ 问题1&a…...

C语言项⽬实践-贪吃蛇
目录 1.项目要点 2.窗口设置 2.1mode命令 2.2title命令 2.3system函数 2.Win32 API 2.1 COORD 2.2 GetStdHandle 2.3 CONSOLE_CURSOR_INFO 2.4 GetConsoleCursorInfo 2.5 SetConsoleCursorInfo 2.5 SetConsoleCursorPosition 2.7 GetAsyncKeyState 3.贪吃蛇游戏设…...

智慧安防丨以科技之力,筑起防范人贩的铜墙铁壁
近日,贵州省贵阳市中级人民法院对余华英拐卖儿童案做出了一审宣判,判处其死刑,剥夺政治权利终身,并处没收个人全部财产。这一判决不仅彰显了法律的威严,也再次唤起了社会对拐卖儿童犯罪的深切关注。 余华英自1993年至2…...

Spring:IoC/DI加载properties文件
Spring框架可以通过Spring的配置文件完成两个数据源druid和C3P0的配置(Spring:IOC/DI配置管理第三方bean),但是其中包含了一些问题,我们来分析下: 这两个数据源中都使用到了一些固定的常量如数据库连接四要素…...

Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 Docker 概述 1.1 Docker 主要组成部分 1.2 Docker 安装 2.0 Docker 常见命令 2.1 常见的命令介绍 2.2 常见的命令演示 3.0 数据卷 3.1 数据卷常见的命令 3.2 常见…...

深挖C++赋值
详解赋值 const int a 10; int b a;&a 0x000000b7c6afef34 {56496} &a 0x000000b7c6afef34 {10} 3. &b 0x000000b7c6afef54 {10} 总结: int a 10 是指在内存中(栈)中创建一个int (4 byte)大小的空间…...

【免越狱】iOS砸壳 可下载AppStore任意版本 旧版本IPA下载
软件介绍 下载iOS旧版应用,简化繁琐的抓包流程。 一键生成去更新IPA(手机安装后,去除App Store的更新检测)。 软件界面 支持系统 Windows 10/Windows 8/Windows 7(由于使用了Fiddler库,因此需要.Net环境…...
【python笔记02】面向对象思想
关于面向对象要学会啥? 面向对象编程思想面向对象基本概念 对象类 添加和获取对象属性魔术方法(三个常见的)面向对象案例 面向对象编程思想 两个时代的两个产物,没有好坏之分,小系统用面向过程,团队开发…...

Java基础-Java多线程机制
(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 一、引言 二、多线程的基本概念 1. 线程与进程 2. 多线程与并发 3. 多线程的优势 三、Java多线程的实…...

MySQL技巧之跨服务器数据查询:基础篇-A数据库与B数据库查询合并--封装到存储过程中
MySQL技巧之跨服务器数据查询:基础篇-A数据库与B数据库查询合并–封装到存储过程中 我们的最终目的是什么?当然的自动执行这些合并操作! 上一篇 MySQL技巧之跨服务器数据查询:基础篇-A数据库与B数据库查询合并 我们已经知道怎么合…...

MATLAB向量元素的引用
我们定义一个向量后,如果想引用的话,可以通过索引 i n d ind ind来实现。 注意:MATLAB中向量的开始索引是1,与许多编程语言不同。 例如: 如果想引用多个的话,可以用索引 i n d ind ind来提取多个位置 例如…...

leetcode-44-通配符匹配
题解: 代码: 参考: (1)牛客华为机试HJ71字符串通配符 (2)leetcode-10-正则表达式匹配...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...