行业资讯 2025年08月6日
0 收藏 0 点赞 945 浏览 1746 个字
摘要 :

文章目录 问题描述 看下简要代码 解决办法 最近在开发Java项目的过程中发现了一个循环依赖问题需要解决,而这个循环依赖产生的原因就是在spring中使用@Autowired注解注……




  • 问题描述
  • 看下简要代码
  • 解决办法

最近在开发Java项目的过程中发现了一个循环依赖问题需要解决,而这个循环依赖产生的原因就是在spring中使用@Autowired注解注入导致的,一般这样的循环依赖很难通过人工查找发现,很多情况是在项目联调测试或者发布启动的时候会在日志中打印出来才被发现,也可能在本地运行没问题,在服务器打包就出错,可能这次打包没错,下次打包就有错了,只要有一次出错了,就说明存在该问题。

问题描述

比如我的这个循环依赖报出如下描述:

Description:
The dependencies of some of the beans in the application context form a cycle:

electionListener (field private com.sf.hlcs.sda.service.OpcAllocationService com.sf.hlcs.sda.election.listener.ElectionListener.opcAllocationService)
┌─────┐
| opcAllocationServiceImpl (field private com.sf.hlcs.sda.election.registry.ServerRegistry com.sf.hlcs.sda.service.impl.OpcAllocationServiceImpl.serverRegistry)
↑ ↓
| serverRegistry (field private com.sf.hlcs.sda.election.listener.NodeListener com.sf.hlcs.sda.election.registry.ServerRegistry.listener)
↑ ↓
| nodeListener (field private com.sf.hlcs.sda.service.OpcAllocationService com.sf.hlcs.sda.election.listener.NodeListener.opcAllocationService)
└─────┘

记录一次Java项目中的循环依赖问题
从上述提示代码可以发现,这里出现的循环依赖是:opcAllocationServiceImpl实体依赖serverRegistry 实体,而serverRegistry 实体依赖nodeListener实体,而nodeListener实体却又依赖opcAllocationServiceImpl实体,这就形成了一个循环依赖的结果。

看下简要代码

// 第一部分
@Service
public class OpcAllocationServiceImpl implements OpcAllocationService {
    @Autowired
    private ServerRegistry serverRegistry;
    // 省略....
}
// 第二部分
@Component
public class ServerRegistry {
    @Autowired
    private NodeListener listener;
    // 省略....
}
// 第三部分
@Component
public class NodeListener implements Listener {
    @Autowired
    private OpcAllocationService opcAllocationService;
    // 省略....
}

通过代码发现,确实出现了循环依赖。

解决办法

我这里的解决办法其实就是将其中的任何一层依赖断开即可,这里我是通过借助了另外一个discovery类来替换了OpcAllocationService类中对ServerRegistry 的依赖,通过discovery类也能实现ServerRegistry 的部分功能,而这部分功能在OpcAllocationService类中已经够用,所以就断开了他们的依赖,从而也解决了循环依赖的问题,当然还有很多其他办法,我这个比较巧的是,正好有其他类可以代替,如果没有其他类代替怎么办?更多的方法请参考:

Spring循环依赖是什么及其解决方式

文章目录 一、什么是循环依赖 二、怎么判断产生了循环依赖 三、3种循环依赖的情况 四、Spring循环依赖如何 […]

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/8209.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号