From 770c94607c939bb509538205dfc70f2182d785eb Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Wed, 22 Oct 2025 19:34:00 -0700 Subject: [PATCH] Refine 'Introduce a shared abstraction for database initialization' Use test fixtures to keep getSettings() package-private See gh-46213 --- module/spring-boot-batch-jdbc/build.gradle | 1 + ...chDataSourceScriptDatabaseInitializer.java | 6 ---- ...aSourceScriptDatabaseInitializerTests.java | 9 ++--- module/spring-boot-integration/build.gradle | 1 + ...onDataSourceScriptDatabaseInitializer.java | 6 ---- ...aSourceScriptDatabaseInitializerTests.java | 6 ++-- module/spring-boot-quartz/build.gradle | 1 + ...tzDataSourceScriptDatabaseInitializer.java | 6 ---- ...aSourceScriptDatabaseInitializerTests.java | 5 +-- module/spring-boot-session-jdbc/build.gradle | 1 + ...onDataSourceScriptDatabaseInitializer.java | 6 ---- ...aSourceScriptDatabaseInitializerTests.java | 6 ++-- .../AbstractScriptDatabaseInitializer.java | 3 +- .../ScriptDatabaseInitializerSettings.java | 33 +++++++++++++++++++ 14 files changed, 52 insertions(+), 38 deletions(-) create mode 100644 module/spring-boot-sql/src/testFixtures/java/org/springframework/boot/sql/init/ScriptDatabaseInitializerSettings.java diff --git a/module/spring-boot-batch-jdbc/build.gradle b/module/spring-boot-batch-jdbc/build.gradle index 371832e4cdb..c5b4e13a488 100644 --- a/module/spring-boot-batch-jdbc/build.gradle +++ b/module/spring-boot-batch-jdbc/build.gradle @@ -39,6 +39,7 @@ dependencies { testImplementation(project(":module:spring-boot-liquibase")) testImplementation(project(":test-support:spring-boot-test-support")) testImplementation(testFixtures(project(":core:spring-boot-autoconfigure"))) + testImplementation(testFixtures(project(":module:spring-boot-sql"))) testImplementation("io.micrometer:micrometer-observation-test") testRuntimeOnly("ch.qos.logback:logback-classic") diff --git a/module/spring-boot-batch-jdbc/src/main/java/org/springframework/boot/batch/jdbc/autoconfigure/BatchDataSourceScriptDatabaseInitializer.java b/module/spring-boot-batch-jdbc/src/main/java/org/springframework/boot/batch/jdbc/autoconfigure/BatchDataSourceScriptDatabaseInitializer.java index bda939f3af3..1311461396b 100644 --- a/module/spring-boot-batch-jdbc/src/main/java/org/springframework/boot/batch/jdbc/autoconfigure/BatchDataSourceScriptDatabaseInitializer.java +++ b/module/spring-boot-batch-jdbc/src/main/java/org/springframework/boot/batch/jdbc/autoconfigure/BatchDataSourceScriptDatabaseInitializer.java @@ -20,7 +20,6 @@ import javax.sql.DataSource; import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer; import org.springframework.boot.jdbc.init.PropertiesBasedDataSourceScriptDatabaseInitializer; -import org.springframework.boot.sql.init.DatabaseInitializationSettings; /** * {@link DataSourceScriptDatabaseInitializer} for the Spring Batch database. May be @@ -45,9 +44,4 @@ public class BatchDataSourceScriptDatabaseInitializer super(dataSource, properties); } - @Override - protected DatabaseInitializationSettings getSettings() { - return super.getSettings(); - } - } diff --git a/module/spring-boot-batch-jdbc/src/test/java/org/springframework/boot/batch/jdbc/autoconfigure/BatchDataSourceScriptDatabaseInitializerTests.java b/module/spring-boot-batch-jdbc/src/test/java/org/springframework/boot/batch/jdbc/autoconfigure/BatchDataSourceScriptDatabaseInitializerTests.java index f295ed64be8..b97a455751b 100644 --- a/module/spring-boot-batch-jdbc/src/test/java/org/springframework/boot/batch/jdbc/autoconfigure/BatchDataSourceScriptDatabaseInitializerTests.java +++ b/module/spring-boot-batch-jdbc/src/test/java/org/springframework/boot/batch/jdbc/autoconfigure/BatchDataSourceScriptDatabaseInitializerTests.java @@ -32,6 +32,7 @@ import org.junit.jupiter.params.provider.EnumSource.Mode; import org.springframework.boot.jdbc.DatabaseDriver; import org.springframework.boot.sql.init.DatabaseInitializationSettings; +import org.springframework.boot.sql.init.ScriptDatabaseInitializerSettings; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; @@ -54,8 +55,8 @@ class BatchDataSourceScriptDatabaseInitializerTests { DataSource dataSource = mock(DataSource.class); BatchJdbcProperties properties = new BatchJdbcProperties(); properties.setPlatform("test"); - DatabaseInitializationSettings settings = new BatchDataSourceScriptDatabaseInitializer(dataSource, properties) - .getSettings(); + DatabaseInitializationSettings settings = ScriptDatabaseInitializerSettings + .get(new BatchDataSourceScriptDatabaseInitializer(dataSource, properties)); assertThat(settings.getSchemaLocations()) .containsOnly("classpath:org/springframework/batch/core/schema-test.sql"); then(dataSource).shouldHaveNoInteractions(); @@ -74,8 +75,8 @@ class BatchDataSourceScriptDatabaseInitializerTests { given(connection.getMetaData()).willReturn(metadata); String productName = (String) ReflectionTestUtils.getField(driver, "productName"); given(metadata.getDatabaseProductName()).willReturn(productName); - DatabaseInitializationSettings settings = new BatchDataSourceScriptDatabaseInitializer(dataSource, properties) - .getSettings(); + DatabaseInitializationSettings settings = ScriptDatabaseInitializerSettings + .get(new BatchDataSourceScriptDatabaseInitializer(dataSource, properties)); List schemaLocations = settings.getSchemaLocations(); assertThat(schemaLocations).isNotEmpty() .allSatisfy((location) -> assertThat(resourceLoader.getResource(location).exists()).isTrue()); diff --git a/module/spring-boot-integration/build.gradle b/module/spring-boot-integration/build.gradle index 2b1ebad160a..dc1015e58b3 100644 --- a/module/spring-boot-integration/build.gradle +++ b/module/spring-boot-integration/build.gradle @@ -41,6 +41,7 @@ dependencies { testImplementation(project(":module:spring-boot-flyway")) testImplementation(project(":module:spring-boot-rsocket")) testImplementation(project(":test-support:spring-boot-test-support")) + testImplementation(testFixtures(project(":module:spring-boot-sql"))) testImplementation(testFixtures(project(":module:spring-boot-webflux"))) testImplementation(testFixtures(project(":module:spring-boot-webmvc"))) testImplementation("org.springframework:spring-web") diff --git a/module/spring-boot-integration/src/main/java/org/springframework/boot/integration/autoconfigure/IntegrationDataSourceScriptDatabaseInitializer.java b/module/spring-boot-integration/src/main/java/org/springframework/boot/integration/autoconfigure/IntegrationDataSourceScriptDatabaseInitializer.java index 85d3cc5e321..e91ffb16b41 100644 --- a/module/spring-boot-integration/src/main/java/org/springframework/boot/integration/autoconfigure/IntegrationDataSourceScriptDatabaseInitializer.java +++ b/module/spring-boot-integration/src/main/java/org/springframework/boot/integration/autoconfigure/IntegrationDataSourceScriptDatabaseInitializer.java @@ -23,7 +23,6 @@ import javax.sql.DataSource; import org.springframework.boot.jdbc.DatabaseDriver; import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer; import org.springframework.boot.jdbc.init.PropertiesBasedDataSourceScriptDatabaseInitializer; -import org.springframework.boot.sql.init.DatabaseInitializationSettings; /** * {@link DataSourceScriptDatabaseInitializer} for the Spring Integration database. May be @@ -47,9 +46,4 @@ public class IntegrationDataSourceScriptDatabaseInitializer super(dataSource, properties, Map.of(DatabaseDriver.MARIADB, "mysql")); } - @Override - protected DatabaseInitializationSettings getSettings() { - return super.getSettings(); - } - } diff --git a/module/spring-boot-integration/src/test/java/org/springframework/boot/integration/autoconfigure/IntegrationDataSourceScriptDatabaseInitializerTests.java b/module/spring-boot-integration/src/test/java/org/springframework/boot/integration/autoconfigure/IntegrationDataSourceScriptDatabaseInitializerTests.java index 137d258b544..87236a4cd1f 100644 --- a/module/spring-boot-integration/src/test/java/org/springframework/boot/integration/autoconfigure/IntegrationDataSourceScriptDatabaseInitializerTests.java +++ b/module/spring-boot-integration/src/test/java/org/springframework/boot/integration/autoconfigure/IntegrationDataSourceScriptDatabaseInitializerTests.java @@ -21,6 +21,7 @@ import javax.sql.DataSource; import org.junit.jupiter.api.Test; import org.springframework.boot.sql.init.DatabaseInitializationSettings; +import org.springframework.boot.sql.init.ScriptDatabaseInitializerSettings; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.then; @@ -38,9 +39,8 @@ class IntegrationDataSourceScriptDatabaseInitializerTests { DataSource dataSource = mock(DataSource.class); IntegrationJdbcProperties properties = new IntegrationJdbcProperties(); properties.setPlatform("test"); - DatabaseInitializationSettings settings = new IntegrationDataSourceScriptDatabaseInitializer(dataSource, - properties) - .getSettings(); + DatabaseInitializationSettings settings = ScriptDatabaseInitializerSettings + .get(new IntegrationDataSourceScriptDatabaseInitializer(dataSource, properties)); assertThat(settings.getSchemaLocations()) .containsOnly("classpath:org/springframework/integration/jdbc/schema-test.sql"); then(dataSource).shouldHaveNoInteractions(); diff --git a/module/spring-boot-quartz/build.gradle b/module/spring-boot-quartz/build.gradle index 061145375e5..1c77924ea60 100644 --- a/module/spring-boot-quartz/build.gradle +++ b/module/spring-boot-quartz/build.gradle @@ -38,6 +38,7 @@ dependencies { testImplementation(project(":module:spring-boot-flyway")) testImplementation(project(":module:spring-boot-liquibase")) testImplementation(project(":test-support:spring-boot-test-support")) + testImplementation(testFixtures(project(":module:spring-boot-sql"))) testImplementation(testFixtures(project(":module:spring-boot-webflux"))) testImplementation(testFixtures(project(":module:spring-boot-webmvc"))) testImplementation("net.minidev:json-smart") diff --git a/module/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzDataSourceScriptDatabaseInitializer.java b/module/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzDataSourceScriptDatabaseInitializer.java index fc71415ef3c..d1711e1ee55 100644 --- a/module/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzDataSourceScriptDatabaseInitializer.java +++ b/module/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzDataSourceScriptDatabaseInitializer.java @@ -26,7 +26,6 @@ import org.jspecify.annotations.Nullable; import org.springframework.boot.jdbc.DatabaseDriver; import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer; import org.springframework.boot.jdbc.init.PropertiesBasedDataSourceScriptDatabaseInitializer; -import org.springframework.boot.sql.init.DatabaseInitializationSettings; import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; import org.springframework.util.ObjectUtils; @@ -58,11 +57,6 @@ public class QuartzDataSourceScriptDatabaseInitializer this.commentPrefixes = properties.getCommentPrefix(); } - @Override - protected DatabaseInitializationSettings getSettings() { - return super.getSettings(); - } - @Override protected void customize(ResourceDatabasePopulator populator) { if (!ObjectUtils.isEmpty(this.commentPrefixes)) { diff --git a/module/spring-boot-quartz/src/test/java/org/springframework/boot/quartz/autoconfigure/QuartzDataSourceScriptDatabaseInitializerTests.java b/module/spring-boot-quartz/src/test/java/org/springframework/boot/quartz/autoconfigure/QuartzDataSourceScriptDatabaseInitializerTests.java index 8d9bdf1c9f7..6c0c6910a71 100644 --- a/module/spring-boot-quartz/src/test/java/org/springframework/boot/quartz/autoconfigure/QuartzDataSourceScriptDatabaseInitializerTests.java +++ b/module/spring-boot-quartz/src/test/java/org/springframework/boot/quartz/autoconfigure/QuartzDataSourceScriptDatabaseInitializerTests.java @@ -23,6 +23,7 @@ import javax.sql.DataSource; import org.junit.jupiter.api.Test; import org.springframework.boot.sql.init.DatabaseInitializationSettings; +import org.springframework.boot.sql.init.ScriptDatabaseInitializerSettings; import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; import static org.assertj.core.api.Assertions.assertThat; @@ -41,8 +42,8 @@ class QuartzDataSourceScriptDatabaseInitializerTests { DataSource dataSource = mock(DataSource.class); QuartzJdbcProperties properties = new QuartzJdbcProperties(); properties.setPlatform("test"); - DatabaseInitializationSettings settings = new QuartzDataSourceScriptDatabaseInitializer(dataSource, properties) - .getSettings(); + DatabaseInitializationSettings settings = ScriptDatabaseInitializerSettings + .get(new QuartzDataSourceScriptDatabaseInitializer(dataSource, properties)); assertThat(settings.getSchemaLocations()) .containsOnly("classpath:org/quartz/impl/jdbcjobstore/tables_test.sql"); then(dataSource).shouldHaveNoInteractions(); diff --git a/module/spring-boot-session-jdbc/build.gradle b/module/spring-boot-session-jdbc/build.gradle index a1e5606cbed..68002f1378d 100644 --- a/module/spring-boot-session-jdbc/build.gradle +++ b/module/spring-boot-session-jdbc/build.gradle @@ -39,6 +39,7 @@ dependencies { testImplementation(project(":module:spring-boot-flyway")) testImplementation(project(":module:spring-boot-liquibase")) testImplementation(testFixtures(project(":module:spring-boot-session"))) + testImplementation(testFixtures(project(":module:spring-boot-sql"))) testImplementation("jakarta.servlet:jakarta.servlet-api") testImplementation("org.apache.commons:commons-dbcp2") testImplementation("org.springframework:spring-web") diff --git a/module/spring-boot-session-jdbc/src/main/java/org/springframework/boot/session/jdbc/autoconfigure/JdbcSessionDataSourceScriptDatabaseInitializer.java b/module/spring-boot-session-jdbc/src/main/java/org/springframework/boot/session/jdbc/autoconfigure/JdbcSessionDataSourceScriptDatabaseInitializer.java index c4938bcee59..7b08627ef6c 100644 --- a/module/spring-boot-session-jdbc/src/main/java/org/springframework/boot/session/jdbc/autoconfigure/JdbcSessionDataSourceScriptDatabaseInitializer.java +++ b/module/spring-boot-session-jdbc/src/main/java/org/springframework/boot/session/jdbc/autoconfigure/JdbcSessionDataSourceScriptDatabaseInitializer.java @@ -23,7 +23,6 @@ import javax.sql.DataSource; import org.springframework.boot.jdbc.DatabaseDriver; import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer; import org.springframework.boot.jdbc.init.PropertiesBasedDataSourceScriptDatabaseInitializer; -import org.springframework.boot.sql.init.DatabaseInitializationSettings; /** * {@link DataSourceScriptDatabaseInitializer} for the Spring Session JDBC database. May @@ -49,9 +48,4 @@ public class JdbcSessionDataSourceScriptDatabaseInitializer super(dataSource, properties, Map.of(DatabaseDriver.MARIADB, "mysql")); } - @Override - protected DatabaseInitializationSettings getSettings() { - return super.getSettings(); - } - } diff --git a/module/spring-boot-session-jdbc/src/test/java/org/springframework/boot/session/jdbc/autoconfigure/JdbcSessionDataSourceScriptDatabaseInitializerTests.java b/module/spring-boot-session-jdbc/src/test/java/org/springframework/boot/session/jdbc/autoconfigure/JdbcSessionDataSourceScriptDatabaseInitializerTests.java index be8c358f347..92bdaf29a2a 100644 --- a/module/spring-boot-session-jdbc/src/test/java/org/springframework/boot/session/jdbc/autoconfigure/JdbcSessionDataSourceScriptDatabaseInitializerTests.java +++ b/module/spring-boot-session-jdbc/src/test/java/org/springframework/boot/session/jdbc/autoconfigure/JdbcSessionDataSourceScriptDatabaseInitializerTests.java @@ -21,6 +21,7 @@ import javax.sql.DataSource; import org.junit.jupiter.api.Test; import org.springframework.boot.sql.init.DatabaseInitializationSettings; +import org.springframework.boot.sql.init.ScriptDatabaseInitializerSettings; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.then; @@ -38,9 +39,8 @@ class JdbcSessionDataSourceScriptDatabaseInitializerTests { DataSource dataSource = mock(DataSource.class); JdbcSessionProperties properties = new JdbcSessionProperties(); properties.setPlatform("test"); - DatabaseInitializationSettings settings = new JdbcSessionDataSourceScriptDatabaseInitializer(dataSource, - properties) - .getSettings(); + DatabaseInitializationSettings settings = ScriptDatabaseInitializerSettings + .get(new JdbcSessionDataSourceScriptDatabaseInitializer(dataSource, properties)); assertThat(settings.getSchemaLocations()) .containsOnly("classpath:org/springframework/session/jdbc/schema-test.sql"); then(dataSource).shouldHaveNoInteractions(); diff --git a/module/spring-boot-sql/src/main/java/org/springframework/boot/sql/init/AbstractScriptDatabaseInitializer.java b/module/spring-boot-sql/src/main/java/org/springframework/boot/sql/init/AbstractScriptDatabaseInitializer.java index dd712ce5a23..86491f9eca4 100644 --- a/module/spring-boot-sql/src/main/java/org/springframework/boot/sql/init/AbstractScriptDatabaseInitializer.java +++ b/module/spring-boot-sql/src/main/java/org/springframework/boot/sql/init/AbstractScriptDatabaseInitializer.java @@ -62,9 +62,8 @@ public abstract class AbstractScriptDatabaseInitializer implements ResourceLoade /** * Return the {@link DatabaseInitializationSettings} being used by the initializer. * @return the settings being used - * @since 4.0.0 */ - protected DatabaseInitializationSettings getSettings() { + DatabaseInitializationSettings getSettings() { return this.settings; } diff --git a/module/spring-boot-sql/src/testFixtures/java/org/springframework/boot/sql/init/ScriptDatabaseInitializerSettings.java b/module/spring-boot-sql/src/testFixtures/java/org/springframework/boot/sql/init/ScriptDatabaseInitializerSettings.java new file mode 100644 index 00000000000..5c28d49c1e4 --- /dev/null +++ b/module/spring-boot-sql/src/testFixtures/java/org/springframework/boot/sql/init/ScriptDatabaseInitializerSettings.java @@ -0,0 +1,33 @@ +/* + * Copyright 2012-present 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.sql.init; + +/** + * Helper to get the settings used by the {@link AbstractScriptDatabaseInitializer}. + * + * @author Phillip Webb + */ +public final class ScriptDatabaseInitializerSettings { + + private ScriptDatabaseInitializerSettings() { + } + + public static DatabaseInitializationSettings get(AbstractScriptDatabaseInitializer initializer) { + return initializer.getSettings(); + } + +}