我正在熟悉整个 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/