Spring应用使用@Autowired注解执行失败问题排查
问题原因与解决方案
核心原因
这是循环依赖导致的Spring启动失败。你的两个类形成了互相依赖的闭环:
ErpDataRepository注入了RequestProcessingServiceRequestProcessingService又注入了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
相关产品推荐
相关产品推荐

