简单Spring Batch示例中非Job方法的Bean注释的目的

时间:2017-04-21 08:34:42

标签: java spring spring-boot spring-batch

我熟悉整个Spring堆栈。

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

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

在我的脑海中,从除@Bean之外的所有方法中删除importUserJob注释,所有这些代码仅在每个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() ...
}

感谢阅读和帮助。

2 个答案:

答案 0 :(得分:1)

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

@Bean带注释的对象使其生命周期由Spring处理,因此它可以正确执行依赖注入。这样,您就可以根据其使用情况(IoC)分离对象的构造。特别是,当您使用自动装配时,依赖注入变得更加容易。

你当然可以手动执行此操作,但这需要很多样板代码,并且您需要发送已配置的对象。在您的示例中,为所有内容创建bean可能没有任何好处,但是当批量变大时,我确信您将错过Springs bean处理的灵活性。我亲自编写了一个没有Spring依赖注入的其他框架的批处理。首先我有一个紧凑的模型,但随着事情的发展,我真的感觉到样板代码的痛苦影响了我的代码的可读性。

此外,Spring托管bean负责处理其他事情,例如关闭资源。

当然,依赖注入只是一种工具,对于某些用例来说可能是一种过度杀伤。您可能会对这些文章感兴趣:

答案 1 :(得分:0)

@Bean注释使方法bean创建方法和结果对象将作为bean在Spring ApplicationContext中注册。

因此,它将参与所述上下文的生命周期,并接收回调,如@PostConstruct带注释的方法将被调用或接口回调如InitializingBean

如果省略@Bean,则不会发生这种情况。例如,对于FlatFileItemReader,这将导致afterPropertiesSet方法未被调用,这将导致未完全初始化的bean。

所以不要忽略@Bean不应该做的事情,因为@Bean相当于XML中的<bean />