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

Spring应用使用@Autowired注解执行失败问题排查

问题原因与解决方案

核心原因

这是循环依赖导致的Spring启动失败。你的两个类形成了互相依赖的闭环:

  • ErpDataRepository 注入了 RequestProcessingService
  • RequestProcessingService 又注入了 ErpDataRepository

Spring初始化Bean时,需要先创建依赖的实例,但创建ErpDataRepository需要先有RequestProcessingService,创建RequestProcessingService又需要先有ErpDataRepository,形成死循环,最终导致启动崩溃,抛出「命令执行失败,退出值为1」的错误。

解决方案

方案1:使用@Lazy延迟初始化

在任意一个类的依赖注入处添加@Lazy注解,让Spring延迟初始化依赖的Bean,打破循环。比如修改ErpDataRepository的注入代码:

@Autowired
@Lazy
private RequestProcessingService requestProcessingService;

或者修改RequestProcessingService的注入:

@Autowired
@Lazy
private ErpDataRepository erpDataRepository;

方案2:改用Setter注入

将其中一个类的字段注入改为Setter方法注入,Spring原生支持通过Setter注入解决循环依赖。比如修改ErpDataRepository:

private RequestProcessingService requestProcessingService;

@Autowired
public void setRequestProcessingService(RequestProcessingService requestProcessingService) {
    this.requestProcessingService = requestProcessingService;
}

方案3:重构代码解耦

提取两个类中重叠的业务逻辑到独立组件(比如新的工具类、Service或Repository),让两个类都依赖这个新组件,彻底打破循环。例如,如果两个类都涉及ERP数据处理,可以抽离出ErpDataHandler类,让ErpDataRepository和RequestProcessingService都注入这个类,而非互相依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:40:23