From 9b65409e23d409da8dc29c4e3cda24a13d3b9b04 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Mon, 29 Mar 2021 19:02:40 +0100 Subject: [PATCH] Generalize database initialization detection and include R2DBC Closes gh-25818 --- .../flyway/FlywayAutoConfiguration.java | 4 +- ...itializerDatabaseInitializerDetector.java} | 10 +- ...DataSourceInitializationConfiguration.java | 6 +- .../JdbcOperationsDependsOnPostProcessor.java | 4 +- .../jdbc/JdbcTemplateAutoConfiguration.java | 4 +- ...rJdbcOperationsDependsOnPostProcessor.java | 4 +- .../DslContextDependsOnPostProcessor.java | 4 +- .../liquibase/LiquibaseAutoConfiguration.java | 4 +- ...DataSourceInitializationConfiguration.java | 3 - .../SqlInitializationAutoConfiguration.java | 4 +- .../main/resources/META-INF/spring.factories | 4 +- .../DataSourceAutoConfigurationTests.java | 4 +- .../HibernateJpaAutoConfigurationTests.java | 4 +- ...lInitializationAutoConfigurationTests.java | 34 +++++++ .../src/docs/asciidoc/howto.adoc | 30 +++--- ...=> FlywayDatabaseInitializerDetector.java} | 10 +- ...endsOnDatabaseInitializationDetector.java} | 12 +-- ...urceScriptDatabaseInitializerDetector.java | 11 +-- ...endsOnDatabaseInitializationDetector.java} | 11 +-- ...LiquibaseDatabaseInitializerDetector.java} | 10 +- ...va => JpaDatabaseInitializerDetector.java} | 16 ++-- ...endsOnDatabaseInitializationDetector.java} | 13 ++- ...2dbcScriptDatabaseInitializerDetector.java | 37 ++++++++ ...ansOfTypeDatabaseInitializerDetector.java} | 18 ++-- ...endsOnDatabaseInitializationDetector.java} | 20 ++-- ...endsOnDatabaseInitializationDetector.java} | 10 +- .../init/dependency/BeansOfTypeDetector.java | 2 +- ...seInitializationDependencyConfigurer.java} | 80 ++++++++-------- .../DatabaseInitializerDetector.java} | 10 +- .../DependsOnDatabaseInitialization.java} | 9 +- ...endsOnDatabaseInitializationDetector.java} | 19 ++-- .../init/dependency/package-info.java | 4 +- .../main/resources/META-INF/spring.factories | 23 ++--- ...tializationDependencyConfigurerTests.java} | 95 +++++++++---------- 34 files changed, 297 insertions(+), 236 deletions(-) rename spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/{FlywayMigrationInitializerDataSourceInitializerDetector.java => FlywayMigrationInitializerDatabaseInitializerDetector.java} (65%) rename spring-boot-project/spring-boot/src/main/java/org/springframework/boot/flyway/{FlywayDataSourceInitializerDetector.java => FlywayDatabaseInitializerDetector.java} (67%) rename spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/{SpringJdbcDependsOnDataSourceInitializationDetector.java => SpringJdbcDependsOnDatabaseInitializationDetector.java} (66%) rename spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jooq/{JooqDependsOnDataSourceInitializationDetector.java => JooqDependsOnDatabaseInitializationDetector.java} (64%) rename spring-boot-project/spring-boot/src/main/java/org/springframework/boot/liquibase/{LiquibaseDataSourceInitializerDetector.java => LiquibaseDatabaseInitializerDetector.java} (68%) rename spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/{JpaDataSourceInitializerDetector.java => JpaDatabaseInitializerDetector.java} (80%) rename spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/{JpaDependsOnDataSourceInitializationDetector.java => JpaDependsOnDatabaseInitializationDetector.java} (71%) create mode 100644 spring-boot-project/spring-boot/src/main/java/org/springframework/boot/r2dbc/init/R2dbcScriptDatabaseInitializerDetector.java rename spring-boot-project/spring-boot/src/main/java/org/springframework/boot/{jdbc/init/dependency/AbstractBeansOfTypeDataSourceInitializerDetector.java => sql/init/dependency/AbstractBeansOfTypeDatabaseInitializerDetector.java} (67%) rename spring-boot-project/spring-boot/src/main/java/org/springframework/boot/{jdbc/init/dependency/AbstractBeansOfTypeDependsOnDataSourceInitializationDetector.java => sql/init/dependency/AbstractBeansOfTypeDependsOnDatabaseInitializationDetector.java} (64%) rename spring-boot-project/spring-boot/src/main/java/org/springframework/boot/{jdbc/init/dependency/AnnotationDependsOnDataSourceInitializationDetector.java => sql/init/dependency/AnnotationDependsOnDatabaseInitializationDetector.java} (72%) rename spring-boot-project/spring-boot/src/main/java/org/springframework/boot/{jdbc => sql}/init/dependency/BeansOfTypeDetector.java (96%) rename spring-boot-project/spring-boot/src/main/java/org/springframework/boot/{jdbc/init/dependency/DataSourceInitializationDependencyConfigurer.java => sql/init/dependency/DatabaseInitializationDependencyConfigurer.java} (56%) rename spring-boot-project/spring-boot/src/main/java/org/springframework/boot/{jdbc/init/dependency/DataSourceInitializerDetector.java => sql/init/dependency/DatabaseInitializerDetector.java} (82%) rename spring-boot-project/spring-boot/src/main/java/org/springframework/boot/{jdbc/init/dependency/DependsOnDataSourceInitialization.java => sql/init/dependency/DependsOnDatabaseInitialization.java} (82%) rename spring-boot-project/spring-boot/src/main/java/org/springframework/boot/{jdbc/init/dependency/DependsOnDataSourceInitializationDetector.java => sql/init/dependency/DependsOnDatabaseInitializationDetector.java} (62%) rename spring-boot-project/spring-boot/src/main/java/org/springframework/boot/{jdbc => sql}/init/dependency/package-info.java (81%) rename spring-boot-project/spring-boot/src/test/java/org/springframework/boot/{jdbc/init/dependency/DataSourceInitializationDependencyConfigurerTests.java => sql/init/dependency/DatabaseInitializationDependencyConfigurerTests.java} (55%) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java index 807df91e70..d5f5571395 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java @@ -50,7 +50,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.boot.context.properties.PropertyMapper; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.boot.jdbc.DatabaseDriver; -import org.springframework.boot.jdbc.init.dependency.DataSourceInitializationDependencyConfigurer; +import org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; @@ -88,7 +88,7 @@ import org.springframework.util.StringUtils; @ConditionalOnProperty(prefix = "spring.flyway", name = "enabled", matchIfMissing = true) @AutoConfigureAfter({ DataSourceAutoConfiguration.class, JdbcTemplateAutoConfiguration.class, HibernateJpaAutoConfiguration.class }) -@Import(DataSourceInitializationDependencyConfigurer.class) +@Import(DatabaseInitializationDependencyConfigurer.class) public class FlywayAutoConfiguration { @Bean diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayMigrationInitializerDataSourceInitializerDetector.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayMigrationInitializerDatabaseInitializerDetector.java similarity index 65% rename from spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayMigrationInitializerDataSourceInitializerDetector.java rename to spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayMigrationInitializerDatabaseInitializerDetector.java index 50fd282015..4199b14b8e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayMigrationInitializerDataSourceInitializerDetector.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayMigrationInitializerDatabaseInitializerDetector.java @@ -19,18 +19,18 @@ package org.springframework.boot.autoconfigure.flyway; import java.util.Collections; import java.util.Set; -import org.springframework.boot.jdbc.init.dependency.AbstractBeansOfTypeDataSourceInitializerDetector; -import org.springframework.boot.jdbc.init.dependency.DataSourceInitializerDetector; +import org.springframework.boot.sql.init.dependency.AbstractBeansOfTypeDatabaseInitializerDetector; +import org.springframework.boot.sql.init.dependency.DatabaseInitializerDetector; /** - * A {@link DataSourceInitializerDetector} for {@link FlywayMigrationInitializer}. + * A {@link DatabaseInitializerDetector} for {@link FlywayMigrationInitializer}. * * @author Andy Wilkinson */ -class FlywayMigrationInitializerDataSourceInitializerDetector extends AbstractBeansOfTypeDataSourceInitializerDetector { +class FlywayMigrationInitializerDatabaseInitializerDetector extends AbstractBeansOfTypeDatabaseInitializerDetector { @Override - protected Set> getDataSourceInitializerBeanTypes() { + protected Set> getDatabaseInitializerBeanTypes() { return Collections.singleton(FlywayMigrationInitializer.class); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitializationConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitializationConfiguration.java index 3a5f847b6e..a49edd5870 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitializationConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitializationConfiguration.java @@ -42,8 +42,8 @@ import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.boot.jdbc.DataSourceInitializationMode; import org.springframework.boot.jdbc.EmbeddedDatabaseConnection; import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer; -import org.springframework.boot.jdbc.init.dependency.DataSourceInitializationDependencyConfigurer; import org.springframework.boot.sql.init.DatabaseInitializationSettings; +import org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ConditionContext; import org.springframework.context.annotation.DependsOn; @@ -85,7 +85,7 @@ class DataSourceInitializationConfiguration { // Fully-qualified to work around javac bug in JDK 1.8 @org.springframework.context.annotation.Configuration(proxyBeanMethods = false) @org.springframework.context.annotation.Conditional(DifferentCredentialsCondition.class) - @org.springframework.context.annotation.Import(DataSourceInitializationDependencyConfigurer.class) + @org.springframework.context.annotation.Import(DatabaseInitializationDependencyConfigurer.class) @ConditionalOnSingleCandidate(DataSource.class) @ConditionalOnMissingBean(DataSourceScriptDatabaseInitializer.class) static class InitializationSpecificCredentialsDataSourceInitializationConfiguration { @@ -141,7 +141,7 @@ class DataSourceInitializationConfiguration { // Fully-qualified to work around javac bug in JDK 1.8 @org.springframework.context.annotation.Configuration(proxyBeanMethods = false) - @org.springframework.context.annotation.Import(DataSourceInitializationDependencyConfigurer.class) + @org.springframework.context.annotation.Import(DatabaseInitializationDependencyConfigurer.class) @org.springframework.context.annotation.Conditional(DataSourceInitializationCondition.class) @ConditionalOnSingleCandidate(DataSource.class) @ConditionalOnMissingBean(DataSourceScriptDatabaseInitializer.class) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/JdbcOperationsDependsOnPostProcessor.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/JdbcOperationsDependsOnPostProcessor.java index e9a40d001d..b78ad4fb86 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/JdbcOperationsDependsOnPostProcessor.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/JdbcOperationsDependsOnPostProcessor.java @@ -19,7 +19,7 @@ package org.springframework.boot.autoconfigure.jdbc; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.boot.autoconfigure.AbstractDependsOnBeanFactoryPostProcessor; -import org.springframework.boot.jdbc.init.dependency.DependsOnDataSourceInitializationDetector; +import org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitializationDetector; import org.springframework.jdbc.core.JdbcOperations; /** @@ -33,7 +33,7 @@ import org.springframework.jdbc.core.JdbcOperations; * @author Andrii Hrytsiuk * @since 2.0.4 * @see BeanDefinition#setDependsOn(String[]) - * @deprecated since 2.5.0 in favor of {@link DependsOnDataSourceInitializationDetector} + * @deprecated since 2.5.0 in favor of {@link DependsOnDatabaseInitializationDetector} */ @Deprecated public class JdbcOperationsDependsOnPostProcessor extends AbstractDependsOnBeanFactoryPostProcessor { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/JdbcTemplateAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/JdbcTemplateAutoConfiguration.java index 799f333c89..0d9b3838af 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/JdbcTemplateAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/JdbcTemplateAutoConfiguration.java @@ -23,7 +23,7 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.jdbc.init.dependency.DataSourceInitializationDependencyConfigurer; +import org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.jdbc.core.JdbcTemplate; @@ -44,7 +44,7 @@ import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; @ConditionalOnSingleCandidate(DataSource.class) @AutoConfigureAfter(DataSourceAutoConfiguration.class) @EnableConfigurationProperties(JdbcProperties.class) -@Import({ DataSourceInitializationDependencyConfigurer.class, JdbcTemplateConfiguration.class, +@Import({ DatabaseInitializationDependencyConfigurer.class, JdbcTemplateConfiguration.class, NamedParameterJdbcTemplateConfiguration.class }) public class JdbcTemplateAutoConfiguration { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/NamedParameterJdbcOperationsDependsOnPostProcessor.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/NamedParameterJdbcOperationsDependsOnPostProcessor.java index 4ad4ddde8e..606b5cf798 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/NamedParameterJdbcOperationsDependsOnPostProcessor.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/NamedParameterJdbcOperationsDependsOnPostProcessor.java @@ -19,7 +19,7 @@ package org.springframework.boot.autoconfigure.jdbc; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.boot.autoconfigure.AbstractDependsOnBeanFactoryPostProcessor; -import org.springframework.boot.jdbc.init.dependency.DependsOnDataSourceInitializationDetector; +import org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitializationDetector; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; /** @@ -31,7 +31,7 @@ import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; * @author Andrii Hrytsiuk * @since 2.1.4 * @see BeanDefinition#setDependsOn(String[]) - * @deprecated since 2.5.0 in favor of {@link DependsOnDataSourceInitializationDetector} + * @deprecated since 2.5.0 in favor of {@link DependsOnDatabaseInitializationDetector} */ @Deprecated public class NamedParameterJdbcOperationsDependsOnPostProcessor extends AbstractDependsOnBeanFactoryPostProcessor { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/DslContextDependsOnPostProcessor.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/DslContextDependsOnPostProcessor.java index 503346e302..0bf284a665 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/DslContextDependsOnPostProcessor.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/DslContextDependsOnPostProcessor.java @@ -21,7 +21,7 @@ import org.jooq.DSLContext; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.boot.autoconfigure.AbstractDependsOnBeanFactoryPostProcessor; -import org.springframework.boot.jdbc.init.dependency.DependsOnDataSourceInitializationDetector; +import org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitializationDetector; /** * {@link BeanFactoryPostProcessor} that can be used to dynamically declare that all @@ -30,7 +30,7 @@ import org.springframework.boot.jdbc.init.dependency.DependsOnDataSourceInitiali * @author EddĂș MelĂ©ndez * @since 2.3.9 * @see BeanDefinition#setDependsOn(String[]) - * @deprecated since 2.5.0 in favor of {@link DependsOnDataSourceInitializationDetector} + * @deprecated since 2.5.0 in favor of {@link DependsOnDatabaseInitializationDetector} */ @Deprecated public class DslContextDependsOnPostProcessor extends AbstractDependsOnBeanFactoryPostProcessor { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration.java index 603bd48fa3..f9743b2835 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration.java @@ -34,7 +34,7 @@ import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfigurati import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.jdbc.init.dependency.DataSourceInitializationDependencyConfigurer; +import org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; @@ -63,7 +63,7 @@ import org.springframework.util.StringUtils; @ConditionalOnProperty(prefix = "spring.liquibase", name = "enabled", matchIfMissing = true) @Conditional(LiquibaseDataSourceCondition.class) @AutoConfigureAfter({ DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class }) -@Import(DataSourceInitializationDependencyConfigurer.class) +@Import(DatabaseInitializationDependencyConfigurer.class) public class LiquibaseAutoConfiguration { @Bean 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 6b5cfbc02e..e836d8dc00 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 @@ -22,19 +22,16 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer; -import org.springframework.boot.jdbc.init.dependency.DataSourceInitializationDependencyConfigurer; import org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer; import org.springframework.boot.sql.init.DatabaseInitializationSettings; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; import org.springframework.jdbc.datasource.SimpleDriverDataSource; import org.springframework.util.StringUtils; @Configuration(proxyBeanMethods = false) @ConditionalOnMissingBean(AbstractScriptDatabaseInitializer.class) @ConditionalOnSingleCandidate(DataSource.class) -@Import(DataSourceInitializationDependencyConfigurer.class) class DataSourceInitializationConfiguration { @Bean diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/sql/init/SqlInitializationAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/sql/init/SqlInitializationAutoConfiguration.java index 33d61fa9f6..909adbc23e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/sql/init/SqlInitializationAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/sql/init/SqlInitializationAutoConfiguration.java @@ -24,6 +24,7 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer; +import org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @@ -38,7 +39,8 @@ import org.springframework.context.annotation.Import; @ConditionalOnProperty(prefix = "spring.sql.init", name = "enabled", matchIfMissing = true) @AutoConfigureAfter({ R2dbcAutoConfiguration.class, DataSourceAutoConfiguration.class }) @EnableConfigurationProperties(SqlInitializationProperties.class) -@Import({ R2dbcInitializationConfiguration.class, DataSourceInitializationConfiguration.class }) +@Import({ DatabaseInitializationDependencyConfigurer.class, R2dbcInitializationConfiguration.class, + DataSourceInitializationConfiguration.class }) public class SqlInitializationAutoConfiguration { } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories b/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories index df1cb2d437..5a0f37feb8 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories @@ -173,5 +173,5 @@ org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityPr org.springframework.boot.autoconfigure.web.servlet.JspTemplateAvailabilityProvider # DataSource initializer detectors -org.springframework.boot.jdbc.init.dependency.DataSourceInitializerDetector=\ -org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializerDataSourceInitializerDetector +org.springframework.boot.sql.init.dependency.DatabaseInitializerDetector=\ +org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializerDatabaseInitializerDetector diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java index 7a94d57d2d..7cc2f74cf2 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java @@ -44,7 +44,7 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.jdbc.DatabaseDriver; import org.springframework.boot.jdbc.EmbeddedDatabaseConnection; import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer; -import org.springframework.boot.jdbc.init.dependency.DependsOnDataSourceInitialization; +import org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitialization; import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.assertj.AssertableApplicationContext; import org.springframework.boot.test.context.runner.ApplicationContextRunner; @@ -283,7 +283,7 @@ class DataSourceAutoConfigurationTests { } @Configuration(proxyBeanMethods = false) - @DependsOnDataSourceInitialization + @DependsOnDatabaseInitialization static class TestInitializedDataSourceConfiguration { private boolean called; diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfigurationTests.java index 233440d36a..8adb8c4252 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfigurationTests.java @@ -59,10 +59,10 @@ import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfigurat import org.springframework.boot.autoconfigure.orm.jpa.mapping.NonAnnotatedEntity; import org.springframework.boot.autoconfigure.orm.jpa.test.City; import org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration; -import org.springframework.boot.jdbc.init.dependency.DependsOnDataSourceInitialization; import org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy; import org.springframework.boot.orm.jpa.hibernate.SpringJtaPlatform; import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy; +import org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitialization; import org.springframework.boot.test.context.assertj.AssertableApplicationContext; import org.springframework.boot.test.context.runner.ContextConsumer; import org.springframework.context.ApplicationEvent; @@ -501,7 +501,7 @@ class HibernateJpaAutoConfigurationTests extends AbstractJpaAutoConfigurationTes @Configuration(proxyBeanMethods = false) @TestAutoConfigurationPackage(City.class) - @DependsOnDataSourceInitialization + @DependsOnDatabaseInitialization static class TestInitializedJpaConfiguration { private boolean called; 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 224c850590..2f2fa43193 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 @@ -24,6 +24,7 @@ import javax.sql.DataSource; import io.r2dbc.spi.ConnectionFactory; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration; @@ -31,6 +32,7 @@ import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer; import org.springframework.boot.r2dbc.init.R2dbcScriptDatabaseInitializer; 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.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -98,6 +100,28 @@ public class SqlInitializationAutoConfigurationTests { .hasBean("customInitializer")); } + @Test + void whenBeanIsAnnotatedAsDependingOnDatabaseInitializationThenItDependsOnR2dbcScriptDatabaseInitializer() { + this.contextRunner.withConfiguration(AutoConfigurations.of(R2dbcAutoConfiguration.class)) + .withUserConfiguration(DependsOnInitializedDatabaseConfiguration.class).run((context) -> { + BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition( + "sqlInitializationAutoConfigurationTests.DependsOnInitializedDatabaseConfiguration"); + assertThat(beanDefinition.getDependsOn()) + .containsExactlyInAnyOrder("r2dbcScriptDatabaseInitializer"); + }); + } + + @Test + void whenBeanIsAnnotatedAsDependingOnDatabaseInitializationThenItDependsOnDataSourceScriptDatabaseInitializer() { + this.contextRunner.withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class)) + .withUserConfiguration(DependsOnInitializedDatabaseConfiguration.class).run((context) -> { + BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition( + "sqlInitializationAutoConfigurationTests.DependsOnInitializedDatabaseConfiguration"); + assertThat(beanDefinition.getDependsOn()) + .containsExactlyInAnyOrder("dataSourceScriptDatabaseInitializer"); + }); + } + @Configuration(proxyBeanMethods = false) static class DatabaseInitializerConfiguration { @@ -116,4 +140,14 @@ public class SqlInitializationAutoConfigurationTests { } + @Configuration(proxyBeanMethods = false) + @DependsOnDatabaseInitialization + static class DependsOnInitializedDatabaseConfiguration { + + DependsOnInitializedDatabaseConfiguration() { + + } + + } + } diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/howto.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/howto.adoc index 0761ecc90d..ee73c11823 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/howto.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/howto.adoc @@ -2163,33 +2163,33 @@ See {spring-boot-autoconfigure-module-code}/liquibase/LiquibaseProperties.java[` [[howto-initialize-a-database-configuring-dependencies]] -=== Depend Upon an Initialized DataSource -DataSource initialization is performed while the application is starting up as part of application context refresh. -To allow an initialized database to be accessed during startup, beans that act as DataSource initializers and beans that -require that DataSource to have been initialized are detected automatically. -Beans whose initialization depends upon the DataSource having been initialized are configured to depend upon those that initialize it. -If, during startup, your application tries to access the database and it has not been initialized, you can configure additional detection of beans that initialize the DataSource and require the DataSource to have been initialized. +=== Depend Upon an Initialized Database +Database initialization is performed while the application is starting up as part of application context refresh. +To allow an initialized database to be accessed during startup, beans that act as database initializers and beans that require that database to have been initialized are detected automatically. +Beans whose initialization depends upon the database having been initialized are configured to depend upon those that initialize it. +If, during startup, your application tries to access the database and it has not been initialized, you can configure additional detection of beans that initialize the database and require the database to have been initialized. [[howto-initialize-a-database-configuring-dependencies-initializer-detection]] -==== Detect a DataSource Initializer -Spring Boot will automatically detect beans of the following types that initialize a `DataSource`: +==== Detect a Database Initializer +Spring Boot will automatically detect beans of the following types that initialize an SQL database: -- `DataSourceInitialization` +- `DataSourceScriptDatabaseInitializer` - `EntityManagerFactory` - `Flyway` - `FlywayMigrationInitializer` +- `R2dbcScriptDatabaseInitializer` - `SpringLiquibase` -If you are using a third-party starter for a DataSource initialization library, it may provide a detector such that beans of other types are also detected automatically. -To have other beans be detected, register an implementation of `DataSourceInitializerDetector` in `META-INF/spring-factories`. +If you are using a third-party starter for a database initialization library, it may provide a detector such that beans of other types are also detected automatically. +To have other beans be detected, register an implementation of `DatabaseInitializerDetector` in `META-INF/spring-factories`. [[howto-initialize-a-database-configuring-dependencies-depends-on-initialization-detection]] -==== Detect a Bean That Depends On DataSource Initialization -Spring Boot will automatically detect beans of the following types that depends upon `DataSource` initialization: +==== Detect a Bean That Depends On Database Initialization +Spring Boot will automatically detect beans of the following types that depends upon database initialization: - `AbstractEntityManagerFactoryBean` (unless configprop:spring.jpa.defer-datasource-initialization[] is set to `true`) - `DSLContext` (jOOQ) @@ -2198,8 +2198,8 @@ Spring Boot will automatically detect beans of the following types that depends - `NamedParameterJdbcOperations` If you are using a third-party starter data access library, it may provide a detector such that beans of other types are also detected automatically. -To have other beans be detected, register an implementation of `DependsOnDataSourceInitializationDetector` in `META-INF/spring-factories`. -Alternatively, annotate the bean's class or its `@Bean` method with `@DependsOnDataSourceInitializationDetector`. +To have other beans be detected, register an implementation of `DependsOnDatabaseInitializationDetector` in `META-INF/spring-factories`. +Alternatively, annotate the bean's class or its `@Bean` method with `@DependsOnDatabaseInitialization`. diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/flyway/FlywayDataSourceInitializerDetector.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/flyway/FlywayDatabaseInitializerDetector.java similarity index 67% rename from spring-boot-project/spring-boot/src/main/java/org/springframework/boot/flyway/FlywayDataSourceInitializerDetector.java rename to spring-boot-project/spring-boot/src/main/java/org/springframework/boot/flyway/FlywayDatabaseInitializerDetector.java index 2636993ca1..3154578c67 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/flyway/FlywayDataSourceInitializerDetector.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/flyway/FlywayDatabaseInitializerDetector.java @@ -21,18 +21,18 @@ import java.util.Set; import org.flywaydb.core.Flyway; -import org.springframework.boot.jdbc.init.dependency.AbstractBeansOfTypeDataSourceInitializerDetector; -import org.springframework.boot.jdbc.init.dependency.DataSourceInitializerDetector; +import org.springframework.boot.sql.init.dependency.AbstractBeansOfTypeDatabaseInitializerDetector; +import org.springframework.boot.sql.init.dependency.DatabaseInitializerDetector; /** - * A {@link DataSourceInitializerDetector} for {@link Flyway}. + * A {@link DatabaseInitializerDetector} for {@link Flyway}. * * @author Andy Wilkinson */ -class FlywayDataSourceInitializerDetector extends AbstractBeansOfTypeDataSourceInitializerDetector { +class FlywayDatabaseInitializerDetector extends AbstractBeansOfTypeDatabaseInitializerDetector { @Override - protected Set> getDataSourceInitializerBeanTypes() { + protected Set> getDatabaseInitializerBeanTypes() { return Collections.singleton(Flyway.class); } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/SpringJdbcDependsOnDataSourceInitializationDetector.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/SpringJdbcDependsOnDatabaseInitializationDetector.java similarity index 66% rename from spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/SpringJdbcDependsOnDataSourceInitializationDetector.java rename to spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/SpringJdbcDependsOnDatabaseInitializationDetector.java index 3f9ac45d92..13ed613745 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/SpringJdbcDependsOnDataSourceInitializationDetector.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/SpringJdbcDependsOnDatabaseInitializationDetector.java @@ -20,21 +20,21 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Set; -import org.springframework.boot.jdbc.init.dependency.AbstractBeansOfTypeDependsOnDataSourceInitializationDetector; -import org.springframework.boot.jdbc.init.dependency.DependsOnDataSourceInitializationDetector; +import org.springframework.boot.sql.init.dependency.AbstractBeansOfTypeDependsOnDatabaseInitializationDetector; +import org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitializationDetector; import org.springframework.jdbc.core.JdbcOperations; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; /** - * {@link DependsOnDataSourceInitializationDetector} for Spring Framework's JDBC support. + * {@link DependsOnDatabaseInitializationDetector} for Spring Framework's JDBC support. * * @author Andy Wilkinson */ -class SpringJdbcDependsOnDataSourceInitializationDetector - extends AbstractBeansOfTypeDependsOnDataSourceInitializationDetector { +class SpringJdbcDependsOnDatabaseInitializationDetector + extends AbstractBeansOfTypeDependsOnDatabaseInitializationDetector { @Override - protected Set> getDependsOnDataSourceInitializationBeanTypes() { + protected Set> getDependsOnDatabaseInitializationBeanTypes() { return new HashSet<>(Arrays.asList(JdbcOperations.class, NamedParameterJdbcOperations.class)); } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/DataSourceScriptDatabaseInitializerDetector.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/DataSourceScriptDatabaseInitializerDetector.java index 1cbcb840a5..48b2332d30 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/DataSourceScriptDatabaseInitializerDetector.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/DataSourceScriptDatabaseInitializerDetector.java @@ -19,19 +19,18 @@ package org.springframework.boot.jdbc.init; import java.util.Collections; import java.util.Set; -import org.springframework.boot.jdbc.init.dependency.AbstractBeansOfTypeDataSourceInitializerDetector; -import org.springframework.boot.jdbc.init.dependency.DataSourceInitializerDetector; +import org.springframework.boot.sql.init.dependency.AbstractBeansOfTypeDatabaseInitializerDetector; +import org.springframework.boot.sql.init.dependency.DatabaseInitializerDetector; /** - * A {@link DataSourceInitializerDetector} for - * {@link DataSourceScriptDatabaseInitializer}. + * A {@link DatabaseInitializerDetector} for {@link DataSourceScriptDatabaseInitializer}. * * @author Andy Wilkinson */ -class DataSourceScriptDatabaseInitializerDetector extends AbstractBeansOfTypeDataSourceInitializerDetector { +class DataSourceScriptDatabaseInitializerDetector extends AbstractBeansOfTypeDatabaseInitializerDetector { @Override - protected Set> getDataSourceInitializerBeanTypes() { + protected Set> getDatabaseInitializerBeanTypes() { return Collections.singleton(DataSourceScriptDatabaseInitializer.class); } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jooq/JooqDependsOnDataSourceInitializationDetector.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jooq/JooqDependsOnDatabaseInitializationDetector.java similarity index 64% rename from spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jooq/JooqDependsOnDataSourceInitializationDetector.java rename to spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jooq/JooqDependsOnDatabaseInitializationDetector.java index 55db2f67e5..7a94e11e1f 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jooq/JooqDependsOnDataSourceInitializationDetector.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jooq/JooqDependsOnDatabaseInitializationDetector.java @@ -21,19 +21,18 @@ import java.util.Set; import org.jooq.DSLContext; -import org.springframework.boot.jdbc.init.dependency.AbstractBeansOfTypeDependsOnDataSourceInitializationDetector; -import org.springframework.boot.jdbc.init.dependency.DependsOnDataSourceInitializationDetector; +import org.springframework.boot.sql.init.dependency.AbstractBeansOfTypeDependsOnDatabaseInitializationDetector; +import org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitializationDetector; /** - * {@link DependsOnDataSourceInitializationDetector} for jOOQ. + * {@link DependsOnDatabaseInitializationDetector} for jOOQ. * * @author Andy Wilkinson */ -class JooqDependsOnDataSourceInitializationDetector - extends AbstractBeansOfTypeDependsOnDataSourceInitializationDetector { +class JooqDependsOnDatabaseInitializationDetector extends AbstractBeansOfTypeDependsOnDatabaseInitializationDetector { @Override - protected Set> getDependsOnDataSourceInitializationBeanTypes() { + protected Set> getDependsOnDatabaseInitializationBeanTypes() { return Collections.singleton(DSLContext.class); } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/liquibase/LiquibaseDataSourceInitializerDetector.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/liquibase/LiquibaseDatabaseInitializerDetector.java similarity index 68% rename from spring-boot-project/spring-boot/src/main/java/org/springframework/boot/liquibase/LiquibaseDataSourceInitializerDetector.java rename to spring-boot-project/spring-boot/src/main/java/org/springframework/boot/liquibase/LiquibaseDatabaseInitializerDetector.java index 138120b62f..26118255c2 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/liquibase/LiquibaseDataSourceInitializerDetector.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/liquibase/LiquibaseDatabaseInitializerDetector.java @@ -21,18 +21,18 @@ import java.util.Set; import liquibase.integration.spring.SpringLiquibase; -import org.springframework.boot.jdbc.init.dependency.AbstractBeansOfTypeDataSourceInitializerDetector; -import org.springframework.boot.jdbc.init.dependency.DataSourceInitializerDetector; +import org.springframework.boot.sql.init.dependency.AbstractBeansOfTypeDatabaseInitializerDetector; +import org.springframework.boot.sql.init.dependency.DatabaseInitializerDetector; /** - * A {@link DataSourceInitializerDetector} for Liquibase. + * A {@link DatabaseInitializerDetector} for Liquibase. * * @author Andy Wilkinson */ -class LiquibaseDataSourceInitializerDetector extends AbstractBeansOfTypeDataSourceInitializerDetector { +class LiquibaseDatabaseInitializerDetector extends AbstractBeansOfTypeDatabaseInitializerDetector { @Override - protected Set> getDataSourceInitializerBeanTypes() { + protected Set> getDatabaseInitializerBeanTypes() { return Collections.singleton(SpringLiquibase.class); } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/JpaDataSourceInitializerDetector.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/JpaDatabaseInitializerDetector.java similarity index 80% rename from spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/JpaDataSourceInitializerDetector.java rename to spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/JpaDatabaseInitializerDetector.java index 0a3c445f6d..81da74c6a1 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/JpaDataSourceInitializerDetector.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/JpaDatabaseInitializerDetector.java @@ -25,26 +25,26 @@ import javax.persistence.EntityManagerFactory; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.boot.jdbc.init.dependency.AbstractBeansOfTypeDataSourceInitializerDetector; -import org.springframework.boot.jdbc.init.dependency.DataSourceInitializerDetector; +import org.springframework.boot.sql.init.dependency.AbstractBeansOfTypeDatabaseInitializerDetector; +import org.springframework.boot.sql.init.dependency.DatabaseInitializerDetector; import org.springframework.core.env.Environment; import org.springframework.util.StringUtils; /** - * A {@link DataSourceInitializerDetector} for JPA. + * A {@link DatabaseInitializerDetector} for JPA. * * @author Andy Wilkinson */ -class JpaDataSourceInitializerDetector extends AbstractBeansOfTypeDataSourceInitializerDetector { +class JpaDatabaseInitializerDetector extends AbstractBeansOfTypeDatabaseInitializerDetector { private final Environment environment; - JpaDataSourceInitializerDetector(Environment environment) { + JpaDatabaseInitializerDetector(Environment environment) { this.environment = environment; } @Override - protected Set> getDataSourceInitializerBeanTypes() { + protected Set> getDatabaseInitializerBeanTypes() { boolean deferred = this.environment.getProperty("spring.jpa.defer-datasource-initialization", boolean.class, false); return deferred ? Collections.singleton(EntityManagerFactory.class) : Collections.emptySet(); @@ -63,8 +63,8 @@ class JpaDataSourceInitializerDetector extends AbstractBeansOfTypeDataSourceInit while (iterator.hasNext()) { String initializerName = iterator.next(); BeanDefinition initializerDefinition = beanFactory.getBeanDefinition(initializerName); - if (JpaDataSourceInitializerDetector.class.getName() - .equals(initializerDefinition.getAttribute(DataSourceInitializerDetector.class.getName()))) { + if (JpaDatabaseInitializerDetector.class.getName() + .equals(initializerDefinition.getAttribute(DatabaseInitializerDetector.class.getName()))) { iterator.remove(); jpaInitializers.add(initializerName); } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/JpaDependsOnDataSourceInitializationDetector.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/JpaDependsOnDatabaseInitializationDetector.java similarity index 71% rename from spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/JpaDependsOnDataSourceInitializationDetector.java rename to spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/JpaDependsOnDatabaseInitializationDetector.java index 187a5882aa..327eadada2 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/JpaDependsOnDataSourceInitializationDetector.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/JpaDependsOnDatabaseInitializationDetector.java @@ -23,27 +23,26 @@ import java.util.Set; import javax.persistence.EntityManagerFactory; -import org.springframework.boot.jdbc.init.dependency.AbstractBeansOfTypeDependsOnDataSourceInitializationDetector; -import org.springframework.boot.jdbc.init.dependency.DependsOnDataSourceInitializationDetector; +import org.springframework.boot.sql.init.dependency.AbstractBeansOfTypeDependsOnDatabaseInitializationDetector; +import org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitializationDetector; import org.springframework.core.env.Environment; import org.springframework.orm.jpa.AbstractEntityManagerFactoryBean; /** - * {@link DependsOnDataSourceInitializationDetector} for JPA. + * {@link DependsOnDatabaseInitializationDetector} for JPA. * * @author Andy Wilkinson */ -class JpaDependsOnDataSourceInitializationDetector - extends AbstractBeansOfTypeDependsOnDataSourceInitializationDetector { +class JpaDependsOnDatabaseInitializationDetector extends AbstractBeansOfTypeDependsOnDatabaseInitializationDetector { private final Environment environment; - JpaDependsOnDataSourceInitializationDetector(Environment environment) { + JpaDependsOnDatabaseInitializationDetector(Environment environment) { this.environment = environment; } @Override - protected Set> getDependsOnDataSourceInitializationBeanTypes() { + protected Set> getDependsOnDatabaseInitializationBeanTypes() { boolean postpone = this.environment.getProperty("spring.jpa.defer-datasource-initialization", boolean.class, false); return postpone ? Collections.emptySet() diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/r2dbc/init/R2dbcScriptDatabaseInitializerDetector.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/r2dbc/init/R2dbcScriptDatabaseInitializerDetector.java new file mode 100644 index 0000000000..a80daecb4a --- /dev/null +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/r2dbc/init/R2dbcScriptDatabaseInitializerDetector.java @@ -0,0 +1,37 @@ +/* + * 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. + * 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.r2dbc.init; + +import java.util.Collections; +import java.util.Set; + +import org.springframework.boot.sql.init.dependency.AbstractBeansOfTypeDatabaseInitializerDetector; +import org.springframework.boot.sql.init.dependency.DatabaseInitializerDetector; + +/** + * A {@link DatabaseInitializerDetector} for {@link R2dbcScriptDatabaseInitializer}. + * + * @author Andy Wilkinson + */ +class R2dbcScriptDatabaseInitializerDetector extends AbstractBeansOfTypeDatabaseInitializerDetector { + + @Override + protected Set> getDatabaseInitializerBeanTypes() { + return Collections.singleton(R2dbcScriptDatabaseInitializer.class); + } + +} diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/AbstractBeansOfTypeDataSourceInitializerDetector.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/AbstractBeansOfTypeDatabaseInitializerDetector.java similarity index 67% rename from spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/AbstractBeansOfTypeDataSourceInitializerDetector.java rename to spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/AbstractBeansOfTypeDatabaseInitializerDetector.java index 9cb2f19a3b..1f634cc75c 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/AbstractBeansOfTypeDataSourceInitializerDetector.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/AbstractBeansOfTypeDatabaseInitializerDetector.java @@ -14,34 +14,32 @@ * limitations under the License. */ -package org.springframework.boot.jdbc.init.dependency; +package org.springframework.boot.sql.init.dependency; import java.util.Collections; import java.util.Set; -import javax.sql.DataSource; - import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; /** - * Base class for {@link DataSourceInitializerDetector DataSourceInitializerDetectors} - * that detect {@link DataSource} beans by type. + * Base class for {@link DatabaseInitializerDetector DatabaseInitializerDetectors} that + * detect database initializer beans by type. * * @author Andy Wilkinson * @since 2.5.0 */ -public abstract class AbstractBeansOfTypeDataSourceInitializerDetector implements DataSourceInitializerDetector { +public abstract class AbstractBeansOfTypeDatabaseInitializerDetector implements DatabaseInitializerDetector { /** - * Returns the bean types that should be detected as being data source initializers. - * @return the data source initializer bean types + * Returns the bean types that should be detected as being database initializers. + * @return the database initializer bean types */ - protected abstract Set> getDataSourceInitializerBeanTypes(); + protected abstract Set> getDatabaseInitializerBeanTypes(); @Override public Set detect(ConfigurableListableBeanFactory beanFactory) { try { - Set> types = getDataSourceInitializerBeanTypes(); + Set> types = getDatabaseInitializerBeanTypes(); return new BeansOfTypeDetector(types).detect(beanFactory); } catch (Throwable ex) { diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/AbstractBeansOfTypeDependsOnDataSourceInitializationDetector.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/AbstractBeansOfTypeDependsOnDatabaseInitializationDetector.java similarity index 64% rename from spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/AbstractBeansOfTypeDependsOnDataSourceInitializationDetector.java rename to spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/AbstractBeansOfTypeDependsOnDatabaseInitializationDetector.java index 6c10ad4dca..dc5722f186 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/AbstractBeansOfTypeDependsOnDataSourceInitializationDetector.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/AbstractBeansOfTypeDependsOnDatabaseInitializationDetector.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.jdbc.init.dependency; +package org.springframework.boot.sql.init.dependency; import java.util.Collections; import java.util.Set; @@ -22,27 +22,27 @@ import java.util.Set; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; /** - * Base class for {@link DependsOnDataSourceInitializationDetector - * InitializedDataSourceDependentDetector} that detect by type beans that depend upon data - * source initialization. + * Base class for {@link DependsOnDatabaseInitializationDetector + * DependsOnDatabaseInitializationDetectors} that detect by type beans that depend upon + * database initialization. * * @author Andy Wilkinson * @since 2.5.0 */ -public abstract class AbstractBeansOfTypeDependsOnDataSourceInitializationDetector - implements DependsOnDataSourceInitializationDetector { +public abstract class AbstractBeansOfTypeDependsOnDatabaseInitializationDetector + implements DependsOnDatabaseInitializationDetector { /** - * Returns the bean types that should be detected as depending on data source + * Returns the bean types that should be detected as depending on database * initialization. - * @return the data source initialization dependent bean types + * @return the database initialization dependent bean types */ - protected abstract Set> getDependsOnDataSourceInitializationBeanTypes(); + protected abstract Set> getDependsOnDatabaseInitializationBeanTypes(); @Override public Set detect(ConfigurableListableBeanFactory beanFactory) { try { - Set> types = getDependsOnDataSourceInitializationBeanTypes(); + Set> types = getDependsOnDatabaseInitializationBeanTypes(); return new BeansOfTypeDetector(types).detect(beanFactory); } catch (Throwable ex) { diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/AnnotationDependsOnDataSourceInitializationDetector.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/AnnotationDependsOnDatabaseInitializationDetector.java similarity index 72% rename from spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/AnnotationDependsOnDataSourceInitializationDetector.java rename to spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/AnnotationDependsOnDatabaseInitializationDetector.java index 3e71f2ada3..6d76427aef 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/AnnotationDependsOnDataSourceInitializationDetector.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/AnnotationDependsOnDatabaseInitializationDetector.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.jdbc.init.dependency; +package org.springframework.boot.sql.init.dependency; import java.util.HashSet; import java.util.Set; @@ -22,18 +22,18 @@ import java.util.Set; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; /** - * {@link DependsOnDataSourceInitializationDetector} that detects beans annotated with - * {@link DependsOnDataSourceInitialization}. + * {@link DependsOnDatabaseInitializationDetector} that detects beans annotated with + * {@link DependsOnDatabaseInitialization}. * * @author Andy Wilkinson */ -class AnnotationDependsOnDataSourceInitializationDetector implements DependsOnDataSourceInitializationDetector { +class AnnotationDependsOnDatabaseInitializationDetector implements DependsOnDatabaseInitializationDetector { @Override public Set detect(ConfigurableListableBeanFactory beanFactory) { Set dependentBeans = new HashSet<>(); for (String beanName : beanFactory.getBeanDefinitionNames()) { - if (beanFactory.findAnnotationOnBean(beanName, DependsOnDataSourceInitialization.class) != null) { + if (beanFactory.findAnnotationOnBean(beanName, DependsOnDatabaseInitialization.class) != null) { dependentBeans.add(beanName); } } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/BeansOfTypeDetector.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/BeansOfTypeDetector.java similarity index 96% rename from spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/BeansOfTypeDetector.java rename to spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/BeansOfTypeDetector.java index 91bbf008e6..928833bd4a 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/BeansOfTypeDetector.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/BeansOfTypeDetector.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.jdbc.init.dependency; +package org.springframework.boot.sql.init.dependency; import java.util.Arrays; import java.util.HashSet; diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/DataSourceInitializationDependencyConfigurer.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/DatabaseInitializationDependencyConfigurer.java similarity index 56% rename from spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/DataSourceInitializationDependencyConfigurer.java rename to spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/DatabaseInitializationDependencyConfigurer.java index b3cd596777..aa4de6cb59 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/DataSourceInitializationDependencyConfigurer.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/DatabaseInitializationDependencyConfigurer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.jdbc.init.dependency; +package org.springframework.boot.sql.init.dependency; import java.util.Collection; import java.util.Collections; @@ -22,8 +22,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import javax.sql.DataSource; - import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.config.BeanDefinition; @@ -40,93 +38,95 @@ import org.springframework.core.type.AnnotationMetadata; import org.springframework.util.StringUtils; /** - * Configures beans that depend upon DataSource initialization with - * {@link BeanDefinition#getDependsOn()} dependencies upon beans that perform - * {@link DataSource} initialization. Intended for {@link Import import} in configuration - * classes that define {@code DataSource} initialization beans or that define beans that - * require DataSource initialization to have completed before they are initialized. + * Configures beans that depend upon SQL database initialization with + * {@link BeanDefinition#getDependsOn() dependencies} upon beans that perform database + * initialization. Intended for {@link Import import} in configuration classes that define + * database initialization beans or that define beans that require database initialization + * to have completed before they are initialized. *

- * Beans that initialize a {@link DataSource} are identified by - * {@link DataSourceInitializerDetector DataSourceInitializerDetectors}. Beans that depend - * upon DataSource initialization are identified by - * {@link DependsOnDataSourceInitializationDetector - * DependsOnDataSourceInitializationDetectors}. + * Beans that initialize a database are identified by {@link DatabaseInitializerDetector + * DatabaseInitializerDetectors}. Beans that depend upon database initialization are + * identified by {@link DependsOnDatabaseInitializationDetector + * DependsOnDatabaseInitializationDetectors}. * * @author Andy Wilkinson * @since 2.5.0 - * @see DataSourceInitializerDetector - * @see DependsOnDataSourceInitializationDetector - * @see DependsOnDataSourceInitialization + * @see DatabaseInitializerDetector + * @see DependsOnDatabaseInitializationDetector + * @see DependsOnDatabaseInitialization */ -public class DataSourceInitializationDependencyConfigurer implements ImportBeanDefinitionRegistrar { +public class DatabaseInitializationDependencyConfigurer implements ImportBeanDefinitionRegistrar { private final Environment environment; - DataSourceInitializationDependencyConfigurer(Environment environment) { + DatabaseInitializationDependencyConfigurer(Environment environment) { this.environment = environment; } @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { - if (registry.containsBeanDefinition(DependsOnDataSourceInitializationPostProcessor.class.getName())) { + if (registry.containsBeanDefinition(DependsOnDatabaseInitializationPostProcessor.class.getName())) { return; } - registry.registerBeanDefinition(DependsOnDataSourceInitializationPostProcessor.class.getName(), + registry.registerBeanDefinition(DependsOnDatabaseInitializationPostProcessor.class.getName(), BeanDefinitionBuilder - .genericBeanDefinition(DependsOnDataSourceInitializationPostProcessor.class, - () -> new DependsOnDataSourceInitializationPostProcessor(this.environment)) + .genericBeanDefinition(DependsOnDatabaseInitializationPostProcessor.class, + () -> new DependsOnDatabaseInitializationPostProcessor(this.environment)) .getBeanDefinition()); } - static class DependsOnDataSourceInitializationPostProcessor implements BeanFactoryPostProcessor { + static class DependsOnDatabaseInitializationPostProcessor implements BeanFactoryPostProcessor { private final Environment environment; - DependsOnDataSourceInitializationPostProcessor(Environment environment) { + DependsOnDatabaseInitializationPostProcessor(Environment environment) { this.environment = environment; } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { - Set detectedDataSourceInitializers = detectDataSourceInitializers(beanFactory); - for (String dependentDefinitionName : detectDependsOnDataSourceInitialization(beanFactory, + Set detectedDatabaseInitializers = detectDatabaseInitializers(beanFactory); + if (detectedDatabaseInitializers.isEmpty()) { + return; + } + for (String dependentDefinitionName : detectDependsOnDatabaseInitialization(beanFactory, this.environment)) { BeanDefinition definition = getBeanDefinition(dependentDefinitionName, beanFactory); String[] dependencies = definition.getDependsOn(); - for (String dependencyName : detectedDataSourceInitializers) { + for (String dependencyName : detectedDatabaseInitializers) { dependencies = StringUtils.addStringToArray(dependencies, dependencyName); } definition.setDependsOn(dependencies); } } - private Set detectDataSourceInitializers(ConfigurableListableBeanFactory beanFactory) { - List detectors = instantiateDetectors(beanFactory, this.environment, - DataSourceInitializerDetector.class); + private Set detectDatabaseInitializers(ConfigurableListableBeanFactory beanFactory) { + List detectors = instantiateDetectors(beanFactory, this.environment, + DatabaseInitializerDetector.class); Set detected = new HashSet<>(); - for (DataSourceInitializerDetector detector : detectors) { + for (DatabaseInitializerDetector detector : detectors) { for (String initializerName : detector.detect(beanFactory)) { detected.add(initializerName); beanFactory.getBeanDefinition(initializerName) - .setAttribute(DataSourceInitializerDetector.class.getName(), detector.getClass().getName()); + .setAttribute(DatabaseInitializerDetector.class.getName(), detector.getClass().getName()); } } detected = Collections.unmodifiableSet(detected); - for (DataSourceInitializerDetector detector : detectors) { + for (DatabaseInitializerDetector detector : detectors) { detector.detectionComplete(beanFactory, detected); } return detected; } - private Collection detectDependsOnDataSourceInitialization(ConfigurableListableBeanFactory beanFactory, + private Collection detectDependsOnDatabaseInitialization(ConfigurableListableBeanFactory beanFactory, Environment environment) { - List detectors = instantiateDetectors(beanFactory, environment, - DependsOnDataSourceInitializationDetector.class); - Set dependentUponDataSourceInitialization = new HashSet<>(); - for (DependsOnDataSourceInitializationDetector detector : detectors) { - dependentUponDataSourceInitialization.addAll(detector.detect(beanFactory)); + List detectors = instantiateDetectors(beanFactory, environment, + DependsOnDatabaseInitializationDetector.class); + Set dependentUponDatabaseInitialization = new HashSet<>(); + for (DependsOnDatabaseInitializationDetector detector : detectors) { + dependentUponDatabaseInitialization.addAll(detector.detect(beanFactory)); } - return dependentUponDataSourceInitialization; + return dependentUponDatabaseInitialization; } private List instantiateDetectors(ConfigurableListableBeanFactory beanFactory, Environment environment, diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/DataSourceInitializerDetector.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/DatabaseInitializerDetector.java similarity index 82% rename from spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/DataSourceInitializerDetector.java rename to spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/DatabaseInitializerDetector.java index c3174c2783..36ba4daee0 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/DataSourceInitializerDetector.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/DatabaseInitializerDetector.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.jdbc.init.dependency; +package org.springframework.boot.sql.init.dependency; import java.util.Set; @@ -23,14 +23,14 @@ import javax.sql.DataSource; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; /** - * Detects beans that initialize a {@link DataSource}. Implementations should be - * registered in {@code META-INF/spring.factories} under the key - * {@code org.springframework.boot.jdbc.init.DependsOnDataSourceInitializationDetector}. + * Detects beans that initialize an SQL database. Implementations should be registered in + * {@code META-INF/spring.factories} under the key + * {@code org.springframework.boot.sql.init.dependency.DatabaseInitializerDetector}. * * @author Andy Wilkinson * @since 2.5.0 */ -public interface DataSourceInitializerDetector { +public interface DatabaseInitializerDetector { /** * Detect beans defined in the given {@code beanFactory} that initialize a diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/DependsOnDataSourceInitialization.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/DependsOnDatabaseInitialization.java similarity index 82% rename from spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/DependsOnDataSourceInitialization.java rename to spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/DependsOnDatabaseInitialization.java index 56281b3cd2..9ff3f5bac1 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/DependsOnDataSourceInitialization.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/DependsOnDatabaseInitialization.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.jdbc.init.dependency; +package org.springframework.boot.sql.init.dependency; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; @@ -25,9 +25,8 @@ import java.lang.annotation.Target; import org.springframework.context.annotation.Bean; /** - * Indicate that a bean's creation and initialization depends upon data source - * initialization having completed. May be used on a bean's class or its - * {@link Bean @Bean} definition. + * Indicate that a bean's creation and initialization depends upon database initialization + * having completed. May be used on a bean's class or its {@link Bean @Bean} definition. * * @author Andy Wilkinson * @since 2.5.0 @@ -35,6 +34,6 @@ import org.springframework.context.annotation.Bean; @Target({ ElementType.TYPE, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) @Documented -public @interface DependsOnDataSourceInitialization { +public @interface DependsOnDatabaseInitialization { } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/DependsOnDataSourceInitializationDetector.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/DependsOnDatabaseInitializationDetector.java similarity index 62% rename from spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/DependsOnDataSourceInitializationDetector.java rename to spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/DependsOnDatabaseInitializationDetector.java index 72e078f58c..75fac61031 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/DependsOnDataSourceInitializationDetector.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/DependsOnDatabaseInitializationDetector.java @@ -14,30 +14,27 @@ * limitations under the License. */ -package org.springframework.boot.jdbc.init.dependency; +package org.springframework.boot.sql.init.dependency; import java.util.Set; -import javax.sql.DataSource; - import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; /** - * Detects beans that depend on {@link DataSource} initialization. Implementations should - * be registered in {@code META-INF/spring.factories} under the key - * {@code org.springframework.boot.jdbc.init.DependsOnDataSourceInitializationDetector}. + * Detects beans that depend on database initialization. Implementations should be + * registered in {@code META-INF/spring.factories} under the key + * {@code org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitializationDetector}. * * @author Andy Wilkinson * @since 2.5.0 */ -public interface DependsOnDataSourceInitializationDetector { +public interface DependsOnDatabaseInitializationDetector { /** - * Detect beans defined in the given {@code beanFactory} that depend on - * {@link DataSource} initialization. If no beans are detected, an empty set is - * returned. + * Detect beans defined in the given {@code beanFactory} that depend on database + * initialization. If no beans are detected, an empty set is returned. * @param beanFactory bean factory to examine - * @return names of any beans that depend upon {@code DataSource} initialization + * @return names of any beans that depend upon database initialization */ Set detect(ConfigurableListableBeanFactory beanFactory); diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/package-info.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/package-info.java similarity index 81% rename from spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/package-info.java rename to spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/package-info.java index b28b0d0896..a41a7d7f05 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/dependency/package-info.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/dependency/package-info.java @@ -15,6 +15,6 @@ */ /** - * Infrastructure for establishing {@code DataSource} initialization bean dependencies. + * Infrastructure for establishing database initialization bean dependencies. */ -package org.springframework.boot.jdbc.init.dependency; +package org.springframework.boot.sql.init.dependency; diff --git a/spring-boot-project/spring-boot/src/main/resources/META-INF/spring.factories b/spring-boot-project/spring-boot/src/main/resources/META-INF/spring.factories index 2c562ded8d..45d7d40af2 100644 --- a/spring-boot-project/spring-boot/src/main/resources/META-INF/spring.factories +++ b/spring-boot-project/spring-boot/src/main/resources/META-INF/spring.factories @@ -79,16 +79,17 @@ org.springframework.boot.liquibase.LiquibaseChangelogMissingFailureAnalyzer org.springframework.boot.diagnostics.FailureAnalysisReporter=\ org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter -# DataSource Initializer Detectors -org.springframework.boot.jdbc.init.dependency.DataSourceInitializerDetector=\ -org.springframework.boot.flyway.FlywayDataSourceInitializerDetector,\ +# Database Initializer Detectors +org.springframework.boot.sql.init.dependency.DatabaseInitializerDetector=\ +org.springframework.boot.flyway.FlywayDatabaseInitializerDetector,\ org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializerDetector,\ -org.springframework.boot.liquibase.LiquibaseDataSourceInitializerDetector,\ -org.springframework.boot.orm.jpa.JpaDataSourceInitializerDetector +org.springframework.boot.liquibase.LiquibaseDatabaseInitializerDetector,\ +org.springframework.boot.orm.jpa.JpaDatabaseInitializerDetector,\ +org.springframework.boot.r2dbc.init.R2dbcScriptDatabaseInitializerDetector -# Depends On DataSource Initialization Detectors -org.springframework.boot.jdbc.init.dependency.DependsOnDataSourceInitializationDetector=\ -org.springframework.boot.jdbc.init.dependency.AnnotationDependsOnDataSourceInitializationDetector,\ -org.springframework.boot.jdbc.SpringJdbcDependsOnDataSourceInitializationDetector,\ -org.springframework.boot.jooq.JooqDependsOnDataSourceInitializationDetector,\ -org.springframework.boot.orm.jpa.JpaDependsOnDataSourceInitializationDetector +# Depends On Database Initialization Detectors +org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitializationDetector=\ +org.springframework.boot.sql.init.dependency.AnnotationDependsOnDatabaseInitializationDetector,\ +org.springframework.boot.jdbc.SpringJdbcDependsOnDatabaseInitializationDetector,\ +org.springframework.boot.jooq.JooqDependsOnDatabaseInitializationDetector,\ +org.springframework.boot.orm.jpa.JpaDependsOnDatabaseInitializationDetector diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/init/dependency/DataSourceInitializationDependencyConfigurerTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/sql/init/dependency/DatabaseInitializationDependencyConfigurerTests.java similarity index 55% rename from spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/init/dependency/DataSourceInitializationDependencyConfigurerTests.java rename to spring-boot-project/spring-boot/src/test/java/org/springframework/boot/sql/init/dependency/DatabaseInitializationDependencyConfigurerTests.java index 744b1794e4..49c34af1fe 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/init/dependency/DataSourceInitializationDependencyConfigurerTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/sql/init/dependency/DatabaseInitializationDependencyConfigurerTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.jdbc.init.dependency; +package org.springframework.boot.sql.init.dependency; import java.io.File; import java.io.FileWriter; @@ -51,55 +51,54 @@ import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; /** - * Tests for {@link DataSourceInitializationDependencyConfigurer}. + * Tests for {@link DatabaseInitializationDependencyConfigurer}. * * @author Andy Wilkinson */ -class DataSourceInitializationDependencyConfigurerTests { +class DatabaseInitializationDependencyConfigurerTests { private final ConfigurableEnvironment environment = new MockEnvironment(); - DataSourceInitializerDetector dataSourceInitializerDetector = MockedDataSourceInitializerDetector.mock; + DatabaseInitializerDetector databaseInitializerDetector = MockedDatabaseInitializerDetector.mock; - DependsOnDataSourceInitializationDetector dependsOnDataSourceInitializationDetector = MockedDependsOnDataSourceInitializationDetector.mock; + DependsOnDatabaseInitializationDetector dependsOnDatabaseInitializationDetector = MockedDependsOnDatabaseInitializationDetector.mock; @TempDir File temp; @BeforeEach void resetMocks() { - reset(MockedDataSourceInitializerDetector.mock, MockedDependsOnDataSourceInitializationDetector.mock); + reset(MockedDatabaseInitializerDetector.mock, MockedDependsOnDatabaseInitializationDetector.mock); } @Test void whenDetectorsAreCreatedThenTheEnvironmentCanBeInjected() { - performDetection(Arrays.asList(ConstructorInjectionDataSourceInitializerDetector.class, - ConstructorInjectionDependsOnDataSourceInitializationDetector.class), (context) -> { + performDetection(Arrays.asList(ConstructorInjectionDatabaseInitializerDetector.class, + ConstructorInjectionDependsOnDatabaseInitializationDetector.class), (context) -> { context.refresh(); - assertThat(ConstructorInjectionDataSourceInitializerDetector.environment) - .isEqualTo(this.environment); - assertThat(ConstructorInjectionDependsOnDataSourceInitializationDetector.environment) + assertThat(ConstructorInjectionDatabaseInitializerDetector.environment).isEqualTo(this.environment); + assertThat(ConstructorInjectionDependsOnDatabaseInitializationDetector.environment) .isEqualTo(this.environment); }); } @Test - void whenDependenciesAreConfiguredThenBeansThatDependUponDataSourceInitializationDependUponDetectedDataSourceInitializers() { + void whenDependenciesAreConfiguredThenBeansThatDependUponDatabaseInitializationDependUponDetectedDatabaseInitializers() { BeanDefinition alpha = BeanDefinitionBuilder.genericBeanDefinition(String.class).getBeanDefinition(); BeanDefinition bravo = BeanDefinitionBuilder.genericBeanDefinition(String.class).getBeanDefinition(); - performDetection(Arrays.asList(MockedDataSourceInitializerDetector.class, - MockedDependsOnDataSourceInitializationDetector.class), (context) -> { + performDetection(Arrays.asList(MockedDatabaseInitializerDetector.class, + MockedDependsOnDatabaseInitializationDetector.class), (context) -> { context.registerBeanDefinition("alpha", alpha); context.registerBeanDefinition("bravo", bravo); - given(this.dataSourceInitializerDetector.detect(context.getBeanFactory())) + given(this.databaseInitializerDetector.detect(context.getBeanFactory())) .willReturn(Collections.singleton("alpha")); - given(this.dependsOnDataSourceInitializationDetector.detect(context.getBeanFactory())) + given(this.dependsOnDatabaseInitializationDetector.detect(context.getBeanFactory())) .willReturn(Collections.singleton("bravo")); context.refresh(); - assertThat(alpha.getAttribute(DataSourceInitializerDetector.class.getName())) - .isEqualTo(MockedDataSourceInitializerDetector.class.getName()); - assertThat(bravo.getAttribute(DataSourceInitializerDetector.class.getName())).isNull(); - verify(this.dataSourceInitializerDetector).detectionComplete(context.getBeanFactory(), + assertThat(alpha.getAttribute(DatabaseInitializerDetector.class.getName())) + .isEqualTo(MockedDatabaseInitializerDetector.class.getName()); + assertThat(bravo.getAttribute(DatabaseInitializerDetector.class.getName())).isNull(); + verify(this.databaseInitializerDetector).detectionComplete(context.getBeanFactory(), Collections.singleton("alpha")); assertThat(bravo.getDependsOn()).containsExactly("alpha"); }); @@ -118,17 +117,17 @@ class DataSourceInitializationDependencyConfigurerTests { } @Configuration(proxyBeanMethods = false) - @Import(DataSourceInitializationDependencyConfigurer.class) + @Import(DatabaseInitializationDependencyConfigurer.class) static class DependencyConfigurerConfiguration { } - static class ConstructorInjectionDataSourceInitializerDetector implements DataSourceInitializerDetector { + static class ConstructorInjectionDatabaseInitializerDetector implements DatabaseInitializerDetector { private static Environment environment; - ConstructorInjectionDataSourceInitializerDetector(Environment environment) { - ConstructorInjectionDataSourceInitializerDetector.environment = environment; + ConstructorInjectionDatabaseInitializerDetector(Environment environment) { + ConstructorInjectionDatabaseInitializerDetector.environment = environment; } @Override @@ -138,13 +137,13 @@ class DataSourceInitializationDependencyConfigurerTests { } - static class ConstructorInjectionDependsOnDataSourceInitializationDetector - implements DependsOnDataSourceInitializationDetector { + static class ConstructorInjectionDependsOnDatabaseInitializationDetector + implements DependsOnDatabaseInitializationDetector { private static Environment environment; - ConstructorInjectionDependsOnDataSourceInitializationDetector(Environment environment) { - ConstructorInjectionDependsOnDataSourceInitializationDetector.environment = environment; + ConstructorInjectionDependsOnDatabaseInitializationDetector(Environment environment) { + ConstructorInjectionDependsOnDatabaseInitializationDetector.environment = environment; } @Override @@ -154,40 +153,40 @@ class DataSourceInitializationDependencyConfigurerTests { } - static class MockedDataSourceInitializerDetector implements DataSourceInitializerDetector { + static class MockedDatabaseInitializerDetector implements DatabaseInitializerDetector { - private static DataSourceInitializerDetector mock = Mockito.mock(DataSourceInitializerDetector.class); + private static DatabaseInitializerDetector mock = Mockito.mock(DatabaseInitializerDetector.class); @Override public Set detect(ConfigurableListableBeanFactory beanFactory) { - return MockedDataSourceInitializerDetector.mock.detect(beanFactory); + return MockedDatabaseInitializerDetector.mock.detect(beanFactory); } @Override public void detectionComplete(ConfigurableListableBeanFactory beanFactory, - Set dataSourceInitializerNames) { - mock.detectionComplete(beanFactory, dataSourceInitializerNames); + Set databaseInitializerNames) { + mock.detectionComplete(beanFactory, databaseInitializerNames); } } - static class MockedDependsOnDataSourceInitializationDetector implements DependsOnDataSourceInitializationDetector { + static class MockedDependsOnDatabaseInitializationDetector implements DependsOnDatabaseInitializationDetector { - private static DependsOnDataSourceInitializationDetector mock = Mockito - .mock(DependsOnDataSourceInitializationDetector.class); + private static DependsOnDatabaseInitializationDetector mock = Mockito + .mock(DependsOnDatabaseInitializationDetector.class); @Override public Set detect(ConfigurableListableBeanFactory beanFactory) { - return MockedDependsOnDataSourceInitializationDetector.mock.detect(beanFactory); + return MockedDependsOnDatabaseInitializationDetector.mock.detect(beanFactory); } } static class DetectorSpringFactoriesClassLoader extends ClassLoader { - private final Set> dataSourceInitializerDetectors = new HashSet<>(); + private final Set> databaseInitializerDetectors = new HashSet<>(); - private final Set> dependsOnDataSourceInitializationDetectors = new HashSet<>(); + private final Set> dependsOnDatabaseInitializationDetectors = new HashSet<>(); private final File temp; @@ -197,12 +196,12 @@ class DataSourceInitializationDependencyConfigurerTests { @SuppressWarnings("unchecked") void register(Class detector) { - if (DataSourceInitializerDetector.class.isAssignableFrom(detector)) { - this.dataSourceInitializerDetectors.add((Class) detector); + if (DatabaseInitializerDetector.class.isAssignableFrom(detector)) { + this.databaseInitializerDetectors.add((Class) detector); } - else if (DependsOnDataSourceInitializationDetector.class.isAssignableFrom(detector)) { - this.dependsOnDataSourceInitializationDetectors - .add((Class) detector); + else if (DependsOnDatabaseInitializationDetector.class.isAssignableFrom(detector)) { + this.dependsOnDatabaseInitializationDetectors + .add((Class) detector); } else { throw new IllegalArgumentException("Unsupported detector type '" + detector.getName() + "'"); @@ -215,10 +214,10 @@ class DataSourceInitializationDependencyConfigurerTests { return super.findResources(name); } Properties properties = new Properties(); - properties.put(DataSourceInitializerDetector.class.getName(), String.join(",", - this.dataSourceInitializerDetectors.stream().map(Class::getName).collect(Collectors.toList()))); - properties.put(DependsOnDataSourceInitializationDetector.class.getName(), - String.join(",", this.dependsOnDataSourceInitializationDetectors.stream().map(Class::getName) + properties.put(DatabaseInitializerDetector.class.getName(), String.join(",", + this.databaseInitializerDetectors.stream().map(Class::getName).collect(Collectors.toList()))); + properties.put(DependsOnDatabaseInitializationDetector.class.getName(), + String.join(",", this.dependsOnDatabaseInitializationDetectors.stream().map(Class::getName) .collect(Collectors.toList()))); File springFactories = new File(this.temp, "spring.factories"); try (FileWriter writer = new FileWriter(springFactories)) {