Java Configuration

Spring 3 提供了使用 Java 而不是 XML 配置应用程序的功能。从 Spring Batch 2.2.0 开始,您可以使用相同的 Java 配置来配置批处理作业。基于 Java 的配置有三个组件:@EnableBatchProcessing 注释和两个生成器。

@EnableBatchProcessing 注释类似于 Spring 系列中的其他 @Enable* 注释。在此情况下,@EnableBatchProcessing 为批处理作业的构建提供了一个基本配置。在此基本配置中,除了使许多 bean 可用于自动注入外,还创建了 StepScopeJobScope 的实例:

  • JobRepository:一个名为 jobRepository 的 bean

  • JobLauncher:一个名为 jobLauncher 的 bean

  • JobRegistry:一个名为 jobRegistry 的 bean

  • JobExplorer:一个名为 jobExplorer 的 bean

  • JobOperator: 名为 jobOperator 的 bean

默认实现提供前面列出的 bean,并且要求将 DataSourcePlatformTransactionManager 提供为上下文中内的 bean。JobRepositoryJobExplorer 实例使用数据源和事务管理器。默认情况下,将使用名为 dataSource 的数据源和名为 transactionManager 的事务管理器。您可以使用 @EnableBatchProcessing 注释的属性来自定义其中任何一个 bean。以下示例展示了如何提供自定义数据源和事务管理器:

@Configuration
@EnableBatchProcessing(dataSourceRef = "batchDataSource", transactionManagerRef = "batchTransactionManager")
public class MyJobConfiguration {

	@Bean
	public DataSource batchDataSource() {
		return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.HSQL)
				.addScript("/org/springframework/batch/core/schema-hsqldb.sql")
				.generateUniqueName(true).build();
	}

	@Bean
	public JdbcTransactionManager batchTransactionManager(DataSource dataSource) {
		return new JdbcTransactionManager(dataSource);
	}

	public Job job(JobRepository jobRepository) {
		return new JobBuilder("myJob", jobRepository)
				//define job flow as needed
				.build();
	}

}

只有一个配置类需要有 @EnableBatchProcessing 注解。一旦有了带该注解的类,你将拥有前面描述的所有配置。

从 v5.0 开始,提供了通过 DefaultBatchConfiguration 类以编程方式配置基本基础设施 bean 的替代方式。此类提供了 @EnableBatchProcessing 提供的相同 bean,并且可以用作配置批处理作业的基本类。以下摘录是如何使用它的一个常见示例:

@Configuration
class MyJobConfiguration extends DefaultBatchConfiguration {

	@Bean
	public Job job(JobRepository jobRepository) {
		return new JobBuilder("job", jobRepository)
				// define job flow as needed
				.build();
	}

}

数据源和事务管理器将从应用程序上下文中解析,并在作业存储库和作业资源管理器上设置。您可以通过覆盖所需的设置器来自定义任何基础设施 bean 的配置。以下示例展示了如何自定义实例的字符编码:

@Configuration
class MyJobConfiguration extends DefaultBatchConfiguration {

	@Bean
	public Job job(JobRepository jobRepository) {
		return new JobBuilder("job", jobRepository)
				// define job flow as needed
				.build();
	}

	@Override
	protected Charset getCharset() {
		return StandardCharsets.ISO_8859_1;
	}
}

@EnableBatchProcessing 应该 notDefaultBatchConfiguration 一起使用。你可以使用声明式方法通过 @EnableBatchProcessing 配置 Spring Batch,或者使用通过扩展 DefaultBatchConfiguration 的编程方法,但不能同时使用两种方法。