我熟悉整个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() ...
}
感谢阅读和帮助。
答案 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 />
。