Java 配置

Spring 3 带来了使用 Java 而不是 XML 配置应用程序的能力。从 Spring Batch 2.2.0 开始,您可以使用相同的 Java 配置来配置批处理 Job。基于 Java 的配置有三个组件:@EnableBatchProcessing 注解和两个构建器。

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

  • JobRepository: 一个名为 jobRepository 的 bean

  • JobLauncher: 一个名为 jobLauncher 的 bean

  • JobRegistry: 一个名为 jobRegistry 的 bean

  • JobExplorer: 一个名为 jobExplorer 的 bean

  • JobOperator: 一个名为 jobOperator 的 bean

默认实现提供了前述列表中提到的 bean,并且要求在上下文中提供一个 DataSource 和一个 PlatformTransactionManager 作为 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);
	}

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

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

从 v5.0 开始,通过 DefaultBatchConfiguration 类提供了一种替代的、编程方式来配置基础基础设施 bean。这个类提供了 @EnableBatchProcessing 提供的相同 bean,可以作为配置批处理 job 的基类使用。以下代码片段是一个典型的使用示例

@Configuration
class MyJobConfiguration extends DefaultBatchConfiguration {

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

}

数据源和事务管理器将从应用程序上下文中解析,并设置到 job repository 和 job explorer 上。您可以通过覆盖所需的 setter 来定制任何基础设施 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;
	}
}
不应将 @EnableBatchProcessingDefaultBatchConfiguration 一起使用。您应该要么通过 @EnableBatchProcessing 使用声明式方式配置 Spring Batch,要么通过继承 DefaultBatchConfiguration 使用编程方式,但不要同时使用这两种方式。