记录一次Java项目中的循环依赖问题

Java技术 潘老师 2年前 (2022-05-05) 1434 ℃ (0) 扫码查看

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

问题描述

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

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.panziye.com/java/4703.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】