spring 通过@Autowired注入对象循环依赖,导致项目
2020-04-09 本文已影响0人
郑州古月歌丶
日常开发的时候,我们总是会不经意间在serviceA中引用serviceB,又在serviceB中引用serviceA,在本地环境下,这样写似乎没什么问题,但是部署测试环境的时候,突然发现项目启动不了,直接扔出以下错误:
has been injected into other beans[XXXXXXXXXX] in its raw version as part of a circular reference

一、分析原因
一开始没有仔细看报错原因,就是本地没有问题,为啥测试就启动不了,然后逐步分析
- 对比本地代码和测试环境代码,发现并没有什么差异,排除这个原因
- springboot版本也没问题,最近也没有升级
- 继续从报错原因入手,翻译过来之后,发现很好理解,xxxService 这个bean已经被注入到xxxServiceA、xxxServiceB这两个bean中了,他们之间存在循环引用(依赖),也就是说:xxxServiceA中注入了xxxService,而xxxService中也要注入xxxServiceA,所以就会出现这种情况。
如果代码这样写,spring在初始化的时候根本不知道要把哪个bean装入容器,导致bean加载失败。
二、解决
- 尝试使用@Lazy注解, 如果两个Bean存在循环依赖,在任意一个上面加上此注解即可
- 解耦,抽出公共部分新建一个service,通过中间对象去解决循环依赖
三、总结
这个问题虽然不是什么大问题,但是在开发过程中也应引起我们的重视。在代码设计的时候,应该尽可能的解耦,避免相互依赖的问题。