You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot2.7.1添加@Lazy解决循环依赖编译报找不到符号错误

问题描述

在修复遗留Spring Boot项目循环依赖问题时,对应业务类代码如下:

@Service
@Slf4j
public class FlowpathSubscriber {

    @Autowired
    @Qualifier("pubSubTemplate")
    private PubSubTemplate pubSubTemplate;

    @Autowired
    private FlowpathBigQueryProcessor flowpathBigQueryProcessor;

    @Value("${subscription}")
    private String subscription;

    @Autowired
    private ObjectMapper objectMapper;

    @Autowired
    @Lazy
    private SlackNotificationService slackNotificationService;
}

在SlackNotificationService依赖上添加@Lazy注解尝试解决循环依赖时,Gradle编译阶段抛出如下错误:

error: cannot find symbol @Lazy

当前项目使用Spring Boot 2.7.1版本,需要定位错误原因并给出修复方案。

错误原因

该报错属于编译期异常,核心原因是编译器找不到@Lazy注解对应的类定义,和Spring Boot 2.7.1版本本身无关,该版本原生支持@Lazy延迟注入能力。绝大多数场景下是以下两类问题触发:

  • 未在类头部导入@Lazy注解,或者导入了错误包路径下的同名@Lazy注解
  • 依赖配置中错误排除了包含@Lazy定义的spring-context包

Spring原生提供的@Lazy注解全限定名为org.springframework.context.annotation.Lazy,只要正常引入Spring Boot核心starter,该依赖会默认传递引入,不需要额外单独添加依赖。

解决方案
  • 优先检查类头部的import语句,添加正确的@Lazy导入:
import org.springframework.context.annotation.Lazy;

如果已经存在同名注解的导入,核对全限定名必须和上述路径一致,不要导入其他第三方组件、框架内部自定义的同名Lazy注解,这类问题大多是IDE自动补全时选错提示项导致的。

  • 如果添加正确导入后依然报错,检查build.gradle中的依赖配置,确认没有在Spring Boot核心starter依赖中添加排除spring-context的规则。如果存在该类排除规则,直接删除即可,不需要额外引入其他依赖。

修复完成后重新执行Gradle编译即可通过,添加@Lazy后容器会在注入阶段先生成SlackNotificationService的代理对象,实际bean实例会在第一次调用该类方法时才完成初始化,即可打破原有的循环依赖链路。


内容的提问来源于stack exchange,提问作者Griffin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 16:57:23