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
相关产品推荐
相关产品推荐

