From 39aa27e13c6c487f0e74aa7b0de0b120877f705a Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 10 Jun 2021 11:27:25 +0100 Subject: [PATCH] Make DB init back off without DatabasePopulator Fixes gh-26850 --- ...DataSourceInitializationConfiguration.java | 3 +++ .../R2dbcInitializationConfiguration.java | 3 ++- ...lInitializationAutoConfigurationTests.java | 22 +++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.java index 8a7089a48767..b591991cb5dc 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.java @@ -18,6 +18,7 @@ import javax.sql.DataSource; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate; import org.springframework.boot.jdbc.DataSourceBuilder; @@ -27,11 +28,13 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.SimpleDriverDataSource; +import org.springframework.jdbc.datasource.init.DatabasePopulator; import org.springframework.util.StringUtils; @Configuration(proxyBeanMethods = false) @ConditionalOnMissingBean(AbstractScriptDatabaseInitializer.class) @ConditionalOnSingleCandidate(DataSource.class) +@ConditionalOnClass(DatabasePopulator.class) class DataSourceInitializationConfiguration { @Bean diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/sql/init/R2dbcInitializationConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/sql/init/R2dbcInitializationConfiguration.java index 5f413416f113..cff498adaf02 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/sql/init/R2dbcInitializationConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/sql/init/R2dbcInitializationConfiguration.java @@ -25,6 +25,7 @@ import org.springframework.boot.sql.init.DatabaseInitializationSettings; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.r2dbc.connection.init.DatabasePopulator; import org.springframework.util.StringUtils; /** @@ -34,7 +35,7 @@ * @author Andy Wilkinson */ @Configuration(proxyBeanMethods = false) -@ConditionalOnClass(ConnectionFactory.class) +@ConditionalOnClass({ ConnectionFactory.class, DatabasePopulator.class }) @ConditionalOnSingleCandidate(ConnectionFactory.class) class R2dbcInitializationConfiguration { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/sql/init/SqlInitializationAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/sql/init/SqlInitializationAutoConfigurationTests.java index 66619c9e7e49..75552557b70e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/sql/init/SqlInitializationAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/sql/init/SqlInitializationAutoConfigurationTests.java @@ -35,10 +35,12 @@ import org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer; import org.springframework.boot.sql.init.DatabaseInitializationSettings; import org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitialization; +import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.Resource; +import org.springframework.jdbc.datasource.init.DatabasePopulator; import static org.assertj.core.api.Assertions.assertThat; @@ -141,6 +143,26 @@ void whenBeanIsAnnotatedAsDependingOnDatabaseInitializationThenItDependsOnDataSo }); } + @Test + void whenADataSourceIsAvailableAndSpringJdbcIsNotThenAutoConfigurationBacksOff() { + this.contextRunner.withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class)) + .withClassLoader(new FilteredClassLoader(DatabasePopulator.class)).run((context) -> { + assertThat(context).hasSingleBean(DataSource.class); + assertThat(context).doesNotHaveBean(AbstractScriptDatabaseInitializer.class); + }); + } + + @Test + void whenAConnectionFactoryIsAvailableAndSpringR2dbcIsNotThenAutoConfigurationBacksOff() { + this.contextRunner.withConfiguration(AutoConfigurations.of(R2dbcAutoConfiguration.class)) + .withClassLoader( + new FilteredClassLoader(org.springframework.r2dbc.connection.init.DatabasePopulator.class)) + .run((context) -> { + assertThat(context).hasSingleBean(ConnectionFactory.class); + assertThat(context).doesNotHaveBean(AbstractScriptDatabaseInitializer.class); + }); + } + @Configuration(proxyBeanMethods = false) static class DatabaseInitializerConfiguration {