diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java index e0ca77d8180..dee16f5b36f 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,8 +27,10 @@ import org.springframework.batch.core.launch.support.SimpleJobOperator; import org.springframework.batch.core.repository.JobRepository; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.ExitCodeGenerator; +import org.springframework.boot.autoconfigure.AbstractDependsOnBeanFactoryPostProcessor; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration.DataSourceInitializerConfiguration.DataSourceInitializationJobRepositoryDependencyConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -100,9 +102,11 @@ public class BatchAutoConfiguration { return factory; } - @Configuration(proxyBeanMethods = false) - @ConditionalOnBean(DataSource.class) - @ConditionalOnClass(DatabasePopulator.class) + // Fully-qualified to work around javac bug + @org.springframework.context.annotation.Configuration(proxyBeanMethods = false) + @org.springframework.boot.autoconfigure.condition.ConditionalOnBean(DataSource.class) + @org.springframework.boot.autoconfigure.condition.ConditionalOnClass(DatabasePopulator.class) + @org.springframework.context.annotation.Import(DataSourceInitializationJobRepositoryDependencyConfiguration.class) static class DataSourceInitializerConfiguration { @Bean @@ -114,6 +118,19 @@ public class BatchAutoConfiguration { properties); } + /** + * Post processor to ensure that {@link JobRepository} beans depend on any + * {@link BatchDataSourceInitializer} beans. + */ + static class DataSourceInitializationJobRepositoryDependencyConfiguration + extends AbstractDependsOnBeanFactoryPostProcessor { + + DataSourceInitializationJobRepositoryDependencyConfiguration() { + super(JobRepository.class, BatchDataSourceInitializer.class); + } + + } + } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java index a00dfca3d0d..dcb1c7914f5 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,6 +39,7 @@ import org.springframework.batch.core.job.AbstractJob; import org.springframework.batch.core.launch.JobLauncher; import org.springframework.batch.core.repository.JobRepository; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.DefaultApplicationArguments; import org.springframework.boot.autoconfigure.AutoConfigurations; @@ -268,6 +269,20 @@ class BatchAutoConfigurationTests { }); } + @Test + void jobRepositoryBeansDependOnBatchDataSourceInitializer() { + this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) + .run((context) -> { + ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); + String[] jobRepositoryNames = beanFactory.getBeanNamesForType(JobRepository.class); + assertThat(jobRepositoryNames).isNotEmpty(); + for (String jobRepositoryName : jobRepositoryNames) { + assertThat(beanFactory.getBeanDefinition(jobRepositoryName).getDependsOn()) + .contains("batchDataSourceInitializer"); + } + }); + } + @Configuration(proxyBeanMethods = false) protected static class BatchDataSourceConfiguration {