Spring Batch中如何在ItemProcessor构造方法中注入UseCase接口?
解决Spring Batch ItemProcessor依赖注入与循环依赖问题
问题根源
- 直接
new RProcessor()创建实例时,该对象不在Spring容器管理范围内,@RequiredArgsConstructor生成的构造函数无法自动获取RUseCase依赖,导致注入失败。 - 后续添加的
@Bean public RUseCase rUseCase(RUseCase rUseCase)属于冗余定义,会触发Spring尝试注入自身,形成循环依赖。
正确解决方案
方案一:手动传入依赖创建Processor实例
修改Batch配置类中的Processor Bean声明,直接在方法参数中注入RUseCase,并传递给RProcessor构造函数:
@Bean public ItemProcessor<PSSEntity, PLEntity> rProcessor(RUseCase rUseCase) { return new RProcessor(rUseCase); }
Spring会自动将容器中RUseCase的实现类(即你的RService)注入到方法参数,再传递给RProcessor的构造函数(由@RequiredArgsConstructor自动生成)。
方案二:将Processor标记为Spring组件
给RProcessor添加@Component注解,让Spring自动扫描并管理该类:
@Slf4j @Component @RequiredArgsConstructor public class RProcessor implements ItemProcessor<PSSEntity, PLEntity> { private final RUseCase rUseCase; @Override public PLEntity process(PSSEntity item) { log.trace("Traitement d'une entrée PSSEntity: {}", item); List<PL> pL = this.rUseCase.findR(item.getP()); return new PLEntity(); } }
之后在Batch配置类中直接注入RProcessor实例即可:
@Bean public ItemProcessor<PSSEntity, PLEntity> rProcessor(RProcessor rProcessor) { return rProcessor; }
甚至可以直接在Step配置中注入RProcessor,无需单独声明该Bean。
清理冗余配置
删除以下无意义的Bean声明:
// 完全不需要这个定义,直接删除 @Bean public RUseCase rUseCase(RUseCase rUseCase) { return rUseCase; }
只要你的RService类添加了@Service注解且在Spring组件扫描路径下,Spring会自动将其作为RUseCase类型的Bean纳入容器管理。
关键说明
- 六边形架构中,
RUseCase作为端口,RService作为适配器实现,确保RService被Spring正确扫描管理即可,无需额外包装。 - Spring Batch的ItemProcessor要实现依赖注入,必须让实例处于Spring容器管控下,要么手动传入依赖,要么标记为Spring组件。
内容的提问来源于stack exchange,提问作者jenoh
相关产品推荐
相关产品推荐

