直接调用@Bean注解的方法。使用依赖注入代替

Sus*_*sie 7 spring intellij-idea spring-batch

我正在关注 Spring Batch 的教程,当我编写以下代码时 - IntelliJ 抱怨作业函数中的 tasklet(null) 调用被直接调用:

Method annotated with @Bean is called directly. Use dependency injection instead.
Run Code Online (Sandbox Code Playgroud)

如果我从作业中删除 @Bean 注释,错误就会消失 - 但我想知道发生了什么。我怎样才能在那里注入豆子?简单地写tasklet(Tasklet tasklet(null))会产生同样的错误。

@Bean
@StepScope
public Tasklet tasklet(@Value("#{jobParameters['name']}") String name) {
    return ((contribution, chunkContext) -> {
        System.out.println(String.format("This is %s", name));
        return RepeatStatus.FINISHED;
    });
}

@Bean
public Job job() {
    return jobBuilderFactory.get("job")
            .start(stepBuilderFactory.get("step1")
                    .tasklet(tasklet(null))               // tasklet(null) = problem
                    .build())
            .build();
}
Run Code Online (Sandbox Code Playgroud)

自闭症谱系障碍

son*_*s21 3

@Bean
@StepScope
public Tasklet tasklet(@Value("#{jobParameters['name']}") String name) {
    return ((contribution, chunkContext) -> {
        System.out.println(String.format("This is %s", name));
        return RepeatStatus.FINISHED;
    });
}

@Bean
public Job job(Tasklet tasklet) {
    return jobBuilderFactory.get("job")
            .start(stepBuilderFactory.get("step1")
                    .tasklet(tasklet)
                    .build())
            .build();
}
Run Code Online (Sandbox Code Playgroud)

Spring Bean 创建和 AOP 非常挑剔。使用时需要非常小心。

在这种情况下,您可以使用bean依赖来解决TaskLet名称为空的问题。