java - 普通 Spring Batch 示例中非作业方法的 Bean 注释的目的

标签 java spring spring-boot spring-batch

我正在熟悉整个 Spring 堆栈。

我在这里指的是 spring.io 上发布的一个简单的 Spring Batch 示例:https://spring.io/guides/gs/batch-processing/

作业配置类 BatchConfiguration 中的每个方法都使用 @Bean 进行注释。除了作业方法 importUserJob 之外,注释由创建作业的单例类型 Bean 方法调用的单例类型 Bean 帮助器方法是否有任何意义?

在我看来,通过从除 importUserJob 之外的所有方法中删除 @Bean 注释,所有这些代码将仅在每个 Spring 实例中调用一次,并且仅在 importUserJob 方法。

所有 Spring Batch 示例都在非作业方法周围显示了 @Bean 注释,因此其中一定有一些我无法理解的东西。

以下摘录:

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
    @Autowired public JobBuilderFactory jobBuilderFactory;
    @Autowired public StepBuilderFactory stepBuilderFactory;
    @Autowired public DataSource dataSource;

    @Bean
    public FlatFileItemReader<Person> reader() ...

    @Bean
    public PersonItemProcessor processor() ...

    @Bean
    public JdbcBatchItemWriter<Person> writer() ...

    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener) {
        return jobBuilderFactory.get("importUserJob")
                .incrementer(new RunIdIncrementer())
                .listener(listener)
                .flow(step1())
                .end()
                .build();
    }

    @Bean
    public Step step1() ...
}

感谢阅读和帮助。

最佳答案

从技术上讲,您可以在不使用 @Bean 的情况下为您提到的那些功能编写批处理,并且您的假设是正确的,因为这些 bean 没有在其他地方使用。 (我自己没有尝试过,但我认为它会运行 - 如果 Spring Batch 不将它们用于其他东西)。

一个被 @Bean 注释的对象的生命周期由 Spring 处理,因此它可以正确地执行依赖注入(inject)。这样,您可以将对象的构造与其使用 (IoC) 分开。特别是,当您使用 Autowiring 时,依赖注入(inject)变得更加容易。

您当然可以手动执行此操作,但这将需要大量样板代码,并且您需要发送已配置的对象。在您的示例中,为所有内容创建 bean 可能没有任何好处,但是当批处理变大时,我相信您会怀念 Springs bean 处理的灵 active 。我个人用其他一些没有 Springs 依赖注入(inject)的框架编写了一个批处理。首先我有一个紧凑的模型,但随着事情的发展,我真的感受到了样板代码的痛苦,它影响了我代码的可读性。

此外,Spring 管理的 beans 负责做其他事情,例如关闭资源。

当然,依赖注入(inject)只是一种工具,对于某些用例来说可能有点矫枉过正。您可能对这些文章感兴趣:

关于java - 普通 Spring Batch 示例中非作业方法的 Bean 注释的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43537785/

相关文章:

java - spring boot如何在没有@Component注解和xml配置的情况下使用@Autowired注入(inject)ApplicationContext和JdbcTemplate的实例?

json - 如何测试 Spring Boot Controller 的错误输出?

java - 我可以使用 java.util.Set 在 Java 中为 DFA 实现状态转换吗

java - Android JUnit 运行 Espresso 和 Robolectric 测试套件

spring - 使用 Spring Boot 外部 log4.properties 文件

java - 为什么 Spring RequestMapping 没有 @Controller 就无法工作?

java - 如何解决 SQLServerException : Invalid object name?

java - 从同一目录中的文件读取

java - 错误 : No functional channel service provider found. 尝试添加对 grpc-okhttp 或 grpc-netty Artifact 的依赖

java - Spring mvc分页如何获取结果