Skip to content

Commit 4b1b2d6

Browse files
committed
Consider Flyway and Liquibase as possible Batch DB initializers
This is a follow-on from 3fec411 which only considered BatchDataSourceInitializer as a possible initializer of Batch's database schema. Flyway and Liquibase are now also considered. Closes gh-27193
1 parent 3fec411 commit 4b1b2d6

File tree

3 files changed

+84
-15
lines changed

3 files changed

+84
-15
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818

1919
import javax.sql.DataSource;
2020

21+
import liquibase.integration.spring.SpringLiquibase;
22+
import org.flywaydb.core.Flyway;
23+
2124
import org.springframework.batch.core.configuration.ListableJobLocator;
2225
import org.springframework.batch.core.converter.JobParametersConverter;
2326
import org.springframework.batch.core.explore.JobExplorer;
@@ -30,11 +33,11 @@
3033
import org.springframework.boot.autoconfigure.AbstractDependsOnBeanFactoryPostProcessor;
3134
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
3235
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
33-
import org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration.DataSourceInitializerConfiguration.DataSourceInitializationJobRepositoryDependencyConfiguration;
3436
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
3537
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3638
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3739
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
40+
import org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer;
3841
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
3942
import org.springframework.boot.context.properties.EnableConfigurationProperties;
4043
import org.springframework.context.annotation.Bean;
@@ -102,11 +105,9 @@ public SimpleJobOperator jobOperator(ObjectProvider<JobParametersConverter> jobP
102105
return factory;
103106
}
104107

105-
// Fully-qualified to work around javac bug
106-
@org.springframework.context.annotation.Configuration(proxyBeanMethods = false)
107-
@org.springframework.boot.autoconfigure.condition.ConditionalOnBean(DataSource.class)
108-
@org.springframework.boot.autoconfigure.condition.ConditionalOnClass(DatabasePopulator.class)
109-
@org.springframework.context.annotation.Import(DataSourceInitializationJobRepositoryDependencyConfiguration.class)
108+
@Configuration(proxyBeanMethods = false)
109+
@ConditionalOnBean(DataSource.class)
110+
@ConditionalOnClass(DatabasePopulator.class)
110111
static class DataSourceInitializerConfiguration {
111112

112113
@Bean
@@ -118,17 +119,39 @@ BatchDataSourceInitializer batchDataSourceInitializer(DataSource dataSource,
118119
properties);
119120
}
120121

121-
/**
122-
* Post processor to ensure that {@link JobRepository} beans depend on any
123-
* {@link BatchDataSourceInitializer} beans.
124-
*/
125-
static class DataSourceInitializationJobRepositoryDependencyConfiguration
126-
extends AbstractDependsOnBeanFactoryPostProcessor {
122+
}
123+
124+
@Configuration(proxyBeanMethods = false)
125+
static class JobRepositoryDependencyConfiguration {
126+
127+
@Bean
128+
JobRepositoryDependsOnBeanFactoryPostProcessor batchDataSourceInitializerJobRepositoryDependsOnBeanFactoryPostProcessor() {
129+
return new JobRepositoryDependsOnBeanFactoryPostProcessor(BatchDataSourceInitializer.class);
130+
}
131+
132+
@Bean
133+
@ConditionalOnClass(name = "org.flywaydb.core.Flyway")
134+
JobRepositoryDependsOnBeanFactoryPostProcessor flywayJobRepositoryDependsOnBeanFactoryPostProcessor() {
135+
return new JobRepositoryDependsOnBeanFactoryPostProcessor(FlywayMigrationInitializer.class, Flyway.class);
136+
}
137+
138+
@Bean
139+
@ConditionalOnClass(name = "liquibase.integration.spring.SpringLiquibase")
140+
JobRepositoryDependsOnBeanFactoryPostProcessor liquibaseJobRepositoryDependsOnBeanFactoryPostProcessor() {
141+
return new JobRepositoryDependsOnBeanFactoryPostProcessor(FlywayMigrationInitializer.class,
142+
SpringLiquibase.class);
143+
}
144+
145+
}
127146

128-
DataSourceInitializationJobRepositoryDependencyConfiguration() {
129-
super(JobRepository.class, BatchDataSourceInitializer.class);
130-
}
147+
/**
148+
* {@link AbstractDependsOnBeanFactoryPostProcessor} for Spring Batch
149+
* {@link JobRepository}.
150+
*/
151+
static class JobRepositoryDependsOnBeanFactoryPostProcessor extends AbstractDependsOnBeanFactoryPostProcessor {
131152

153+
JobRepositoryDependsOnBeanFactoryPostProcessor(Class<?>... dependencyTypes) {
154+
super(JobRepository.class, dependencyTypes);
132155
}
133156

134157
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/JdbcSessionConfiguration.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import org.springframework.beans.factory.ObjectProvider;
2424
import org.springframework.beans.factory.annotation.Autowired;
25+
import org.springframework.boot.autoconfigure.AbstractDependsOnBeanFactoryPostProcessor;
2526
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2627
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2728
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -80,4 +81,17 @@ void customize(SessionProperties sessionProperties, JdbcSessionProperties jdbcSe
8081

8182
}
8283

84+
/**
85+
* Post processor to ensure that {@link JdbcIndexedSessionRepository} beans depend on
86+
* any {@link JdbcSessionDataSourceInitializer} beans.
87+
*/
88+
static class DataSourceInitializationJdbcIndexedSessionRepositoryDependencyConfiguration
89+
extends AbstractDependsOnBeanFactoryPostProcessor {
90+
91+
DataSourceInitializationJdbcIndexedSessionRepositoryDependencyConfiguration() {
92+
super(JdbcIndexedSessionRepository.class, JdbcSessionDataSourceInitializer.class);
93+
}
94+
95+
}
96+
8397
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@
4444
import org.springframework.boot.DefaultApplicationArguments;
4545
import org.springframework.boot.autoconfigure.AutoConfigurations;
4646
import org.springframework.boot.autoconfigure.TestAutoConfigurationPackage;
47+
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
4748
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
49+
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration;
4850
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
4951
import org.springframework.boot.autoconfigure.orm.jpa.test.City;
5052
import org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration;
@@ -283,6 +285,36 @@ void jobRepositoryBeansDependOnBatchDataSourceInitializer() {
283285
});
284286
}
285287

288+
@Test
289+
void jobRepositoryBeansDependOnFlyway() {
290+
this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class)
291+
.withUserConfiguration(FlywayAutoConfiguration.class)
292+
.withPropertyValues("spring.batch.initialize-schema=never").run((context) -> {
293+
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
294+
String[] jobRepositoryNames = beanFactory.getBeanNamesForType(JobRepository.class);
295+
assertThat(jobRepositoryNames).isNotEmpty();
296+
for (String jobRepositoryName : jobRepositoryNames) {
297+
assertThat(beanFactory.getBeanDefinition(jobRepositoryName).getDependsOn()).contains("flyway",
298+
"flywayInitializer");
299+
}
300+
});
301+
}
302+
303+
@Test
304+
void jobRepositoryBeansDependOnLiquibase() {
305+
this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class)
306+
.withUserConfiguration(LiquibaseAutoConfiguration.class)
307+
.withPropertyValues("spring.batch.initialize-schema=never").run((context) -> {
308+
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
309+
String[] jobRepositoryNames = beanFactory.getBeanNamesForType(JobRepository.class);
310+
assertThat(jobRepositoryNames).isNotEmpty();
311+
for (String jobRepositoryName : jobRepositoryNames) {
312+
assertThat(beanFactory.getBeanDefinition(jobRepositoryName).getDependsOn())
313+
.contains("liquibase");
314+
}
315+
});
316+
}
317+
286318
@Configuration(proxyBeanMethods = false)
287319
protected static class BatchDataSourceConfiguration {
288320

0 commit comments

Comments
 (0)