protected void initialize() throws Exception {
BatchConfigurer configurer = getConfigurer(context.getBeansOfType(BatchConfigurer.class).values());
で、最終行のthis.configurer = configurers.iterator().next();
を通過し、そのconfigが使われる事になる。
次に、自前のBatchConfigurer
が無い場合。こちらは、dataSource
のbean定義の有無で若干挙動が変化する。どちらのケースでもDefaultBatchConfigurer
を使うことに変わりはないが、使用するコンストラクタが異なる。
ここまでの流れで、特に何もしなければBatchConfigurer
のデフォルト実装DefaultBatchConfigurer
が各種beanのインスタンス生成を行い、もしカスタマイズしたければBatchConfigurer
を拡張するbean定義をすればそれが自動的に使用される、ということが分かる。
ただし、spring-bootではBatchConfigurer
を自前で設定しない場合にDefaultBatchConfigurer
が使われるわけではない。
DefaultBatchConfigurer
このクラスは名前のとおりJobRepository
やPlatformTransactionManager
などのspring-batchで必要となるbeanの実際のインスタンス生成を一通り行う……が、ひとまずこのクラスの中見るのは後回し。なんでかというとspring-bootでなんも設定しないとこのクラスではなく下記のBasicBatchConfigurer
が使われるため。また、やってる事は後述のBasicBatchConfigurer
はほとんど変わらない。
BasicBatchConfigurer
spring-bootでは(SpringBootApplication
とか付与する場合)特になんも設定しないとorg.springframework.boot.autoconfigure.batch.BasicBatchConfigurer
が使われる。
public class BasicBatchConfigurer implements BatchConfigurer {
@PostConstruct
public void initialize() {
this.transactionManager = buildTransactionManager();
this.jobRepository = createJobRepository();
this.jobLauncher = createJobLauncher();
this.jobExplorer = createJobExplorer();
protected JobExplorer createJobExplorer() throws Exception {
JobExplorerFactoryBean factory = new JobExplorerFactoryBean();
protected JobLauncher createJobLauncher() throws Exception {
SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
protected JobRepository createJobRepository() throws Exception {
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
protected PlatformTransactionManager createTransactionManager() {
return new DataSourceTransactionManager(this.dataSource);
やってる事はシンプルでspring-batchを動作させるのに必要最小限のbean定義を行っている。DefaultBatchConfigurer
とほとんどやってる事は変わらない。では、このクラスが有効になる条件とは何か。
BatchConfigurerConfiguration
org.springframework.boot.autoconfigure.batch.BatchConfigurerConfiguration
というクラスがあり、このクラスは以下のようになっている。
@ConditionalOnClass(PlatformTransactionManager.class)
@ConditionalOnMissingBean(BatchConfigurer.class)
@Configuration
class BatchConfigurerConfiguration {
詳細は省略するが@SpringBootApplication
を付与するとその内部のcomponentScanの結果により、上記configクラスがscan対象になる。そして、クラスパスにPlatformTransactionManager
が存在し、BatchConfigurer
のbean定義が無い場合にこのconfigが有効になる。つまり、自前のBatchConfigurer
のbean定義が有ればこのconfigは使われない。無い場合はこのconfigが使用され、このクラスが作成するBasicBatchConfigurer
のbean定義が使われる。
BasicBatchConfigurer
を作ってる箇所は以下のようになっている。
@Configuration
@ConditionalOnMissingBean(name = "entityManagerFactory")
static class JdbcBatchConfiguration {
@Bean
public BasicBatchConfigurer batchConfigurer(BatchProperties properties,
DataSource dataSource,
ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) {
return new BasicBatchConfigurer(properties, dataSource,
transactionManagerCustomizers.getIfAvailable());
このクラスにはJpaBatchConfigurer
を返すbean定義も存在する。上記はentityManagerFactory
が無い場合に有効になり、JPAではない場合くらいの意味。JpaBatchConfigurer
についてはとりあえず触れない。
それで、メソッドの引数のbeanはどこかで定義しておく必要がある。以下の通り。