如果用java config的方式配置spring batch中的相關bean,則可能會遇到@EnableBatchProcessing這個註解。
這個註解的用法一般出現在配置文件的上方,如下所示:
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public FlatFileItemReader<CreditBill> flatFileItemReader(){
......
}
......
}
@EnableBatchProcessing
這個註解的作用,和spring 家庭中的@Enable* 系列註解功能很類似。顧名思義,就是讓我們可以運行Spring Batch。
在配置類上打上這個註解,spring 會自動 幫我們生成一系列與spring batch 運行有關的bean,並交給spring容器管理,而當我們需要這些beans時,只需要用一個@autowired就可以實現注入了。
自動生成的bean及名稱如下:
JobRepository - bean name "jobRepository"
JobLauncher - bean name "jobLauncher"
JobRegistry - bean name "jobRegistry"
PlatformTransactionManager - bean name "transactionManager"
JobBuilderFactory - bean name "jobBuilders"
StepBuilderFactory - bean name "stepBuilders"
如果用過 .xml 文件配置過spring batch 的同學肯定知道,一個spring batch 要運行起來,需要配置 jobRepository、JobLauncher等,還有定義Job以及其相應的步驟,也需要大量的xml代碼。
如果用java config方式 ,並用上該註解,則會節省很多xml配置上的編寫。
@Configuration
@EnableBatchProcessing
public class BatchConfig02 {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
//相當於用 <batch:job> 標籤來定義step
@Bean
public Job creditBillPersistJob(){
return jobBuilderFactory.get("creditBillPersistJob")
.start(creditBillPersistStep())
.build();
}
//相當於用 <batch:step> 標籤來定義step
@Bean
public Step creditBillPersistStep(){
return stepBuilderFactory.get("creditBillPersistStep")
.<CreditBill, CreditBill>chunk(2)
.reader(flatFileItemReader())
.processor(creditBillProcess02())
.writer(creditBillDBWritter02())
.build();
}
@Bean
public FlatFileItemReader<CreditBill> flatFileItemReader(){
FlatFileItemReader<CreditBill> reader = new FlatFileItemReader<>();
Resource resource = new FileSystemResource("src\\main\\resources\\data\\ch02\\credit_bill_info_02.txt");
reader.setResource(resource);
BeanWrapperFieldSetMapper fieldSetMapper = new BeanWrapperFieldSetMapper();
fieldSetMapper.setTargetType(CreditBill.class);
DefaultLineMapper<CreditBill> lineMapper = new DefaultLineMapper<>();
lineMapper.setFieldSetMapper(fieldSetMapper);
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
tokenizer.setDelimiter(",");
tokenizer.setNames("accountId", "name", "txnAmount", "txnDate", "address");
lineMapper.setLineTokenizer(tokenizer);
reader.setLineMapper(lineMapper);
return reader;
}
@Bean
public CreditBillProcess02 creditBillProcess02(){
return new CreditBillProcess02();
}
@Bean
public ItemWriter<CreditBill> creditBillDBWritter02(){
return new CreditBillDBWritter02();
}
}
在上面的示例中,因爲我們用了 @EnableBatchProcessing 註解,所以我們可以直接注入 JobBuilderFactory 、StepBuilderFactory 對象,而這個對象,正是我們定義job、step所必須的。
當然,我們可以改變@EnableBatchProcessing 給我們的對象。
比如,我們想讓返回的jobRepository用上我們自定義的數據源,想讓元數據的表前綴變成SPRING_BATCH_,而不是默認的BATCH_前綴,@EnableBatchProcessing 提供了讓我們覆寫的接口。
先看看用xml文件配置,如何自定義 jobRepository:
<batch:job-repository id="jobRepository" data-source="dataSource"
transaction-manager="transactionManager"
isolation-level-for-create="SERIALIZABLE"
table-prefix="SPRING_BATCH_"
max-varchar-length="1000" />
@EnableBatchProcessing 背後所調用的接口是BatchConfigurer。這個接口的代碼如下:
public interface BatchConfigurer {
JobRepository getJobRepository() throws Exception;
PlatformTransactionManager getTransactionManager() throws Exception;
JobLauncher getJobLauncher() throws Exception;
JobExplorer getJobExplorer() throws Exception;
}
我們可以自定義一個實現 BatchConfigurer 接口的類,重寫相應的方法,在裏面改變返回的對象。
但更常見的情況是,我們重寫 DefaultBatchConfigurer 裏面的若干方法來實現自身需求。
DefaultBatchConfigurer 是spring batch 提供的 BatchConfigurer 接口的默認實現類,即默認情況下,@EnableBatchProcessing註解所生成的對象,都是在 DefaultBatchConfigurer 中進行配置了的。
所以,我們可以在 DefaultBatchConfigurer 的基礎上進行重寫,這其實可以滿足我們的大部分需求,如:
//只重寫獲取 transactionManager 的方法
@Bean
public BatchConfigurer batchConfigurer() {
return new DefaultBatchConfigurer() {
@Override
public PlatformTransactionManager getTransactionManager() {
return new MyTransactionManager();
}
};
}
以上便是關於 @EnableBatchProcessing 註解的解析。
參考:https://docs.spring.io/spring-batch/docs/4.2.x/reference/pdf/spring-batch-reference.pdf