【问题标题】:Method annotated with @Bean is called directly. Use dependency injection instead直接调用带有@Bean 注解的方法。改用依赖注入
【发布时间】:2020-06-20 09:23:38
【问题描述】:

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

Method annotated with @Bean is called directly. Use dependency injection instead.

如果我从作业中删除 @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();
}

asd

【问题讨论】:

    标签: spring intellij-idea spring-batch


    【解决方案1】:
    @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();
    }
    

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

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

    【讨论】:

    • 谢谢。但是我很难理解发生了什么。正如我所说,我还可以通过从作业中删除 @Bean 注释来解决这个问题。在这种情况下,AOP 是如何挑剔的,如果我想向 bean 传递参数怎么办?
    • AOP这里没有到位,这里到位的是bean创建。 IIUC 值注释在这里没有作用,因为您是从同一个类中调用该方法。
    猜你喜欢
    • 2019-11-03
    • 2023-03-09
    • 1970-01-01
    • 2023-03-12
    • 2014-06-28
    • 2019-04-26
    • 1970-01-01
    • 2019-12-25
    • 2012-04-25
    相关资源
    最近更新 更多