混用 Lombok 导致循环引用报错

问题描述

使用 Mac 拉取项目代码,打成 Jar 包后单独运行时抛循环引用报错,在 Mac 上直接通过 IDEA 运行不会抛该错误。且使用 Windows 系统拉取同一份代码编译并打包的 Jar 包运行时不会抛该错误。

可控变量

  • 确认 SpringBoot 版本(2.3.12.RELEASE,小于 2.6,默认允许循环引用并会尝试解决)
  • 尝试使用相同版本的 IDEA(无效)
  • 尝试使用相同版本的 Maven(无效)
  • 使用 JD-GUI 反编译.class文件,对比编译结果(完全相同,其实先做这一步就可以完全排除上面两个导致的可能)

问题定位

因为 Windows 构建的 Jar 包可以正常执行,所以我先入为主地认为代码是正确的,没有将错误的可能归结到代码问题上。后续检查代码,发现代码 SubsidyProjectServiceImpl 类下,开发人员同时使用了 @Resource 注解和 lombok 提供的 @AllArgsConstructor 注解,所以初步怀疑是因为混用两种注入方式产生冲突导致的,遂去掉 @AllArgsContructor 注解并编译打包,程序正常启动。

当两个或多个 Bean 均使用构造器注入,且 相互引用/循环引用 时,Spring 是无法解决该循环引用的,如去掉 @Resource@Autowired 只使用 @AllArgsConstructor 来进行注入,得到的还是循环引用报错。若要使用构造器注入且不抛出循环引用报错,应手动实现构造器方法,并添加 @Lazy 注解。