美文网首页
spring 通过@Autowired注入对象循环依赖,导致项目

spring 通过@Autowired注入对象循环依赖,导致项目

作者: 郑州古月歌丶 | 来源:发表于2020-04-09 14:46 被阅读0次

日常开发的时候,我们总是会不经意间在serviceA中引用serviceB,又在serviceB中引用serviceA,在本地环境下,这样写似乎没什么问题,但是部署测试环境的时候,突然发现项目启动不了,直接扔出以下错误:

has been injected into other beans[XXXXXXXXXX] in its raw version as part of a circular reference

图片.png

一、分析原因

一开始没有仔细看报错原因,就是本地没有问题,为啥测试就启动不了,然后逐步分析

  • 对比本地代码和测试环境代码,发现并没有什么差异,排除这个原因
  • springboot版本也没问题,最近也没有升级
  • 继续从报错原因入手,翻译过来之后,发现很好理解,xxxService 这个bean已经被注入到xxxServiceA、xxxServiceB这两个bean中了,他们之间存在循环引用(依赖),也就是说:xxxServiceA中注入了xxxService,而xxxService中也要注入xxxServiceA,所以就会出现这种情况。如果代码这样写,spring在初始化的时候根本不知道要把哪个bean装入容器,导致bean加载失败。

二、解决

  • 尝试使用@Lazy注解, 如果两个Bean存在循环依赖,在任意一个上面加上此注解即可
  • 解耦,抽出公共部分新建一个service,通过中间对象去解决循环依赖

三、总结

这个问题虽然不是什么大问题,但是在开发过程中也应引起我们的重视。在代码设计的时候,应该尽可能的解耦,避免相互依赖的问题。

相关文章

网友评论

      本文标题:spring 通过@Autowired注入对象循环依赖,导致项目

      本文链接:https://www.haomeiwen.com/subject/bhrcmhtx.html