这是一个比较奇怪的报错情况,在另外一台 windows11 笔记本上打包出来,运行未发现异常;但在 MacBook 上打包出来,运行就会报循环依赖的错误。在 MacBook 上打包后使用本地配置运行依然抱错,排除了配置环境的问题。

看了一下两个类,例如 A,B。A、B 都是 @service,B 中使用 @Autowired 注解注入了 A,但 A 中只是定义了私有的最终的 B 类字段,除了 A 类上增加了一个 @RequiredArgsConstructor。通过百度了解到这个注解相当于给类增加了一个带参的构造函数,这个配合定义的 final 类字段,形成了通过构造函数注入的功能,与在字段上添加 @Autowired 来注入对象作用相同。

所以结构上是有循环依赖的。但搜索网上出现的情况,里面都提到了版本号在 2.6.0 以上框架才不允许循环依赖,且我这个项目在其他的电脑上是可以正常运行的。不得不说,这很让人费解。

网上提到了解决依赖循环的方法,一个是去除依赖循环,这对于当前的代码不太现实,因为两个类确有互相调用的情况。另一个方法就是在其中一个依赖注入的地方添加 @Lazy 注解,这样这个依赖会默认不加载,等用到的时候另一个类已经完成实例化并添加到容器中了。有了先后顺序,自然就解除了依赖循环的情况。