Skip to content

Commit bee0082

Browse files
wilkinsonaphilwebb
andcommitted
Separate R2DBC and JDBC database initialization
Co-authored-by: Phillip Webb <[email protected]>
1 parent da923b4 commit bee0082

File tree

24 files changed

+382
-215
lines changed

24 files changed

+382
-215
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/jdbc/DataSourcePoolMetricsAutoConfigurationTests.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun;
3434
import org.springframework.boot.autoconfigure.AutoConfigurations;
3535
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
36-
import org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration;
36+
import org.springframework.boot.autoconfigure.jdbc.DataSourceInitializationAutoConfiguration;
3737
import org.springframework.boot.jdbc.DataSourceBuilder;
3838
import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadataProvider;
3939
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
@@ -123,8 +123,8 @@ void autoConfiguredHikariDataSourceIsInstrumented() {
123123
@Test
124124
void autoConfiguredHikariDataSourceIsInstrumentedWhenUsingDataSourceInitialization() {
125125
this.contextRunner.withPropertyValues("spring.sql.init.schema:db/create-custom-schema.sql")
126-
.withConfiguration(
127-
AutoConfigurations.of(DataSourceAutoConfiguration.class, SqlInitializationAutoConfiguration.class))
126+
.withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class,
127+
DataSourceInitializationAutoConfiguration.class))
128128
.run((context) -> {
129129
context.getBean(DataSource.class).getConnection();
130130
MeterRegistry registry = context.getBean(MeterRegistry.class);

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/orm/jpa/HibernateMetricsAutoConfigurationTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@
3535
import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun;
3636
import org.springframework.boot.autoconfigure.AutoConfigurations;
3737
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
38+
import org.springframework.boot.autoconfigure.jdbc.DataSourceInitializationAutoConfiguration;
3839
import org.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryBuilderCustomizer;
3940
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
40-
import org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration;
4141
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
4242
import org.springframework.boot.test.context.FilteredClassLoader;
4343
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
@@ -154,7 +154,7 @@ void entityManagerFactoryInstrumentationDoesNotDeadlockWithDeferredInitializatio
154154
this.contextRunner
155155
.withPropertyValues("spring.jpa.properties.hibernate.generate_statistics:true",
156156
"spring.sql.init.schema-locations:city-schema.sql", "spring.sql.init.data-locations=city-data.sql")
157-
.withConfiguration(AutoConfigurations.of(SqlInitializationAutoConfiguration.class))
157+
.withConfiguration(AutoConfigurations.of(DataSourceInitializationAutoConfiguration.class))
158158
.withBean(EntityManagerFactoryBuilderCustomizer.class,
159159
() -> (builder) -> builder.setBootstrapExecutor(new SimpleAsyncTaskExecutor()))
160160
.run((context) -> {
Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,14 @@
1414
* limitations under the License.
1515
*/
1616

17-
package org.springframework.boot.autoconfigure.sql.init;
17+
package org.springframework.boot.autoconfigure.jdbc;
1818

1919
import javax.sql.DataSource;
2020

21+
import org.springframework.boot.autoconfigure.sql.init.ApplicationScriptDatabaseInitializer;
22+
import org.springframework.boot.autoconfigure.sql.init.SqlInitializationProperties;
2123
import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer;
2224
import org.springframework.boot.sql.init.DatabaseInitializationSettings;
23-
import org.springframework.context.annotation.ImportRuntimeHints;
2425

2526
/**
2627
* {@link DataSourceScriptDatabaseInitializer} for the primary SQL database. May be
@@ -30,39 +31,27 @@
3031
* @author Phillip Webb
3132
* @since 2.6.0
3233
*/
33-
@ImportRuntimeHints(SqlInitializationScriptsRuntimeHints.class)
34-
public class SqlDataSourceScriptDatabaseInitializer extends DataSourceScriptDatabaseInitializer {
34+
public class ApplicationDataSourceScriptDatabaseInitializer extends DataSourceScriptDatabaseInitializer
35+
implements ApplicationScriptDatabaseInitializer {
3536

3637
/**
37-
* Create a new {@link SqlDataSourceScriptDatabaseInitializer} instance.
38+
* Create a new {@link ApplicationDataSourceScriptDatabaseInitializer} instance.
3839
* @param dataSource the primary SQL data source
3940
* @param properties the SQL initialization properties
40-
* @see #getSettings
4141
*/
42-
public SqlDataSourceScriptDatabaseInitializer(DataSource dataSource, SqlInitializationProperties properties) {
43-
this(dataSource, getSettings(properties));
42+
public ApplicationDataSourceScriptDatabaseInitializer(DataSource dataSource,
43+
SqlInitializationProperties properties) {
44+
this(dataSource, ApplicationScriptDatabaseInitializer.getSettings(properties));
4445
}
4546

4647
/**
47-
* Create a new {@link SqlDataSourceScriptDatabaseInitializer} instance.
48+
* Create a new {@link ApplicationDataSourceScriptDatabaseInitializer} instance.
4849
* @param dataSource the primary SQL data source
4950
* @param settings the database initialization settings
50-
* @see #getSettings
5151
*/
52-
public SqlDataSourceScriptDatabaseInitializer(DataSource dataSource, DatabaseInitializationSettings settings) {
52+
public ApplicationDataSourceScriptDatabaseInitializer(DataSource dataSource,
53+
DatabaseInitializationSettings settings) {
5354
super(dataSource, settings);
5455
}
5556

56-
/**
57-
* Adapts {@link SqlInitializationProperties SQL initialization properties} to
58-
* {@link DatabaseInitializationSettings}.
59-
* @param properties the SQL initialization properties
60-
* @return a new {@link DatabaseInitializationSettings} instance
61-
* @see #SqlDataSourceScriptDatabaseInitializer(DataSource,
62-
* DatabaseInitializationSettings)
63-
*/
64-
public static DatabaseInitializationSettings getSettings(SqlInitializationProperties properties) {
65-
return SettingsCreator.createFrom(properties);
66-
}
67-
6857
}

spring-boot-project/spring-boot-autoconfigure-all/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3131
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
3232
import org.springframework.boot.autoconfigure.jdbc.metadata.DataSourcePoolMetadataProvidersConfiguration;
33-
import org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration;
3433
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3534
import org.springframework.boot.jdbc.DataSourceBuilder;
3635
import org.springframework.boot.jdbc.EmbeddedDatabaseConnection;
@@ -56,7 +55,7 @@
5655
* @author Olga Maciaszek-Sharma
5756
* @since 1.0.0
5857
*/
59-
@AutoConfiguration(before = SqlInitializationAutoConfiguration.class)
58+
@AutoConfiguration(before = DataSourceInitializationAutoConfiguration.class)
6059
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
6160
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")
6261
@EnableConfigurationProperties(DataSourceProperties.class)
Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -14,30 +14,46 @@
1414
* limitations under the License.
1515
*/
1616

17-
package org.springframework.boot.autoconfigure.sql.init;
17+
package org.springframework.boot.autoconfigure.jdbc;
1818

1919
import javax.sql.DataSource;
2020

21+
import org.springframework.boot.autoconfigure.AutoConfiguration;
2122
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2223
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2324
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
25+
import org.springframework.boot.autoconfigure.sql.init.ApplicationScriptDatabaseInitializer;
26+
import org.springframework.boot.autoconfigure.sql.init.ConditionalOnSqlInitialization;
27+
import org.springframework.boot.autoconfigure.sql.init.SqlInitializationProperties;
28+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
2429
import org.springframework.boot.jdbc.DataSourceBuilder;
30+
import org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer;
2531
import org.springframework.context.annotation.Bean;
26-
import org.springframework.context.annotation.Configuration;
32+
import org.springframework.context.annotation.Import;
2733
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
2834
import org.springframework.jdbc.datasource.init.DatabasePopulator;
2935
import org.springframework.util.StringUtils;
3036

31-
@Configuration(proxyBeanMethods = false)
32-
@ConditionalOnMissingBean({ SqlDataSourceScriptDatabaseInitializer.class, SqlR2dbcScriptDatabaseInitializer.class })
37+
/**
38+
* Auto-configuration for {@link DataSource} initialization.
39+
*
40+
* @author Andy Wilkinson
41+
* @author Phillip Webb
42+
* @since 4.0.0
43+
*/
44+
@AutoConfiguration
45+
@ConditionalOnMissingBean(ApplicationScriptDatabaseInitializer.class)
3346
@ConditionalOnSingleCandidate(DataSource.class)
3447
@ConditionalOnClass(DatabasePopulator.class)
35-
class DataSourceInitializationConfiguration {
48+
@Import(DatabaseInitializationDependencyConfigurer.class)
49+
@EnableConfigurationProperties(SqlInitializationProperties.class)
50+
@ConditionalOnSqlInitialization
51+
public class DataSourceInitializationAutoConfiguration {
3652

3753
@Bean
38-
SqlDataSourceScriptDatabaseInitializer dataSourceScriptDatabaseInitializer(DataSource dataSource,
54+
ApplicationDataSourceScriptDatabaseInitializer dataSourceScriptDatabaseInitializer(DataSource dataSource,
3955
SqlInitializationProperties properties) {
40-
return new SqlDataSourceScriptDatabaseInitializer(
56+
return new ApplicationDataSourceScriptDatabaseInitializer(
4157
determineDataSource(dataSource, properties.getUsername(), properties.getPassword()), properties);
4258
}
4359

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,16 @@
1414
* limitations under the License.
1515
*/
1616

17-
package org.springframework.boot.autoconfigure.sql.init;
17+
package org.springframework.boot.autoconfigure.r2dbc;
1818

1919
import io.r2dbc.spi.ConnectionFactory;
2020

2121
import org.springframework.boot.autoconfigure.batch.BatchDataSourceScriptDatabaseInitializer;
22+
import org.springframework.boot.autoconfigure.jdbc.ApplicationDataSourceScriptDatabaseInitializer;
23+
import org.springframework.boot.autoconfigure.sql.init.ApplicationScriptDatabaseInitializer;
24+
import org.springframework.boot.autoconfigure.sql.init.SqlInitializationProperties;
2225
import org.springframework.boot.r2dbc.init.R2dbcScriptDatabaseInitializer;
2326
import org.springframework.boot.sql.init.DatabaseInitializationSettings;
24-
import org.springframework.context.annotation.ImportRuntimeHints;
2527

2628
/**
2729
* {@link R2dbcScriptDatabaseInitializer} for the primary SQL database. May be registered
@@ -31,41 +33,27 @@
3133
* @author Phillip Webb
3234
* @since 2.6.0
3335
*/
34-
@ImportRuntimeHints(SqlInitializationScriptsRuntimeHints.class)
35-
public class SqlR2dbcScriptDatabaseInitializer extends R2dbcScriptDatabaseInitializer {
36+
public class ApplicationR2dbcScriptDatabaseInitializer extends R2dbcScriptDatabaseInitializer
37+
implements ApplicationScriptDatabaseInitializer {
3638

3739
/**
38-
* Create a new {@link SqlDataSourceScriptDatabaseInitializer} instance.
40+
* Create a new {@link ApplicationDataSourceScriptDatabaseInitializer} instance.
3941
* @param connectionFactory the primary SQL connection factory
4042
* @param properties the SQL initialization properties
41-
* @see #getSettings
4243
*/
43-
public SqlR2dbcScriptDatabaseInitializer(ConnectionFactory connectionFactory,
44+
public ApplicationR2dbcScriptDatabaseInitializer(ConnectionFactory connectionFactory,
4445
SqlInitializationProperties properties) {
45-
super(connectionFactory, getSettings(properties));
46+
super(connectionFactory, ApplicationScriptDatabaseInitializer.getSettings(properties));
4647
}
4748

4849
/**
4950
* Create a new {@link BatchDataSourceScriptDatabaseInitializer} instance.
5051
* @param connectionFactory the primary SQL connection factory
5152
* @param settings the database initialization settings
52-
* @see #getSettings
5353
*/
54-
public SqlR2dbcScriptDatabaseInitializer(ConnectionFactory connectionFactory,
54+
public ApplicationR2dbcScriptDatabaseInitializer(ConnectionFactory connectionFactory,
5555
DatabaseInitializationSettings settings) {
5656
super(connectionFactory, settings);
5757
}
5858

59-
/**
60-
* Adapts {@link SqlInitializationProperties SQL initialization properties} to
61-
* {@link DatabaseInitializationSettings}.
62-
* @param properties the SQL initialization properties
63-
* @return a new {@link DatabaseInitializationSettings} instance
64-
* @see #SqlR2dbcScriptDatabaseInitializer(ConnectionFactory,
65-
* DatabaseInitializationSettings)
66-
*/
67-
public static DatabaseInitializationSettings getSettings(SqlInitializationProperties properties) {
68-
return SettingsCreator.createFrom(properties);
69-
}
70-
7159
}

spring-boot-project/spring-boot-autoconfigure-all/src/main/java/org/springframework/boot/autoconfigure/r2dbc/R2dbcAutoConfiguration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -31,7 +31,6 @@
3131
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3232
import org.springframework.boot.autoconfigure.condition.ConditionalOnResource;
3333
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
34-
import org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration;
3534
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3635
import org.springframework.context.annotation.Bean;
3736
import org.springframework.context.annotation.Import;
@@ -44,7 +43,7 @@
4443
* @author Stephane Nicoll
4544
* @since 2.3.0
4645
*/
47-
@AutoConfiguration(before = { DataSourceAutoConfiguration.class, SqlInitializationAutoConfiguration.class })
46+
@AutoConfiguration(before = { DataSourceAutoConfiguration.class, R2dbcInitializationAutoConfiguration.class })
4847
@ConditionalOnClass(ConnectionFactory.class)
4948
@ConditionalOnResource(resources = "classpath:META-INF/services/io.r2dbc.spi.ConnectionFactoryProvider")
5049
@EnableConfigurationProperties(R2dbcProperties.class)
Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -14,35 +14,47 @@
1414
* limitations under the License.
1515
*/
1616

17-
package org.springframework.boot.autoconfigure.sql.init;
17+
package org.springframework.boot.autoconfigure.r2dbc;
1818

1919
import io.r2dbc.spi.ConnectionFactory;
2020

21+
import org.springframework.boot.autoconfigure.AutoConfiguration;
2122
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2223
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2324
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
25+
import org.springframework.boot.autoconfigure.jdbc.ApplicationDataSourceScriptDatabaseInitializer;
26+
import org.springframework.boot.autoconfigure.sql.init.ConditionalOnSqlInitialization;
27+
import org.springframework.boot.autoconfigure.sql.init.SqlInitializationProperties;
28+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
2429
import org.springframework.boot.r2dbc.ConnectionFactoryBuilder;
30+
import org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer;
2531
import org.springframework.context.annotation.Bean;
26-
import org.springframework.context.annotation.Configuration;
32+
import org.springframework.context.annotation.Import;
2733
import org.springframework.r2dbc.connection.init.DatabasePopulator;
2834
import org.springframework.util.StringUtils;
2935

3036
/**
31-
* Configuration for initializing an SQL database accessed through an R2DBC
37+
* Auto-configuration for initializing an SQL database accessed through an R2DBC
3238
* {@link ConnectionFactory}.
3339
*
3440
* @author Andy Wilkinson
41+
* @author Phillip Webb
42+
* @since 4.0.0
3543
*/
36-
@Configuration(proxyBeanMethods = false)
44+
@AutoConfiguration
3745
@ConditionalOnClass({ ConnectionFactory.class, DatabasePopulator.class })
3846
@ConditionalOnSingleCandidate(ConnectionFactory.class)
39-
@ConditionalOnMissingBean({ SqlR2dbcScriptDatabaseInitializer.class, SqlDataSourceScriptDatabaseInitializer.class })
40-
class R2dbcInitializationConfiguration {
47+
@ConditionalOnMissingBean({ ApplicationR2dbcScriptDatabaseInitializer.class,
48+
ApplicationDataSourceScriptDatabaseInitializer.class })
49+
@ConditionalOnSqlInitialization
50+
@Import(DatabaseInitializationDependencyConfigurer.class)
51+
@EnableConfigurationProperties(SqlInitializationProperties.class)
52+
public class R2dbcInitializationAutoConfiguration {
4153

4254
@Bean
43-
SqlR2dbcScriptDatabaseInitializer r2dbcScriptDatabaseInitializer(ConnectionFactory connectionFactory,
55+
ApplicationR2dbcScriptDatabaseInitializer r2dbcScriptDatabaseInitializer(ConnectionFactory connectionFactory,
4456
SqlInitializationProperties properties) {
45-
return new SqlR2dbcScriptDatabaseInitializer(
57+
return new ApplicationR2dbcScriptDatabaseInitializer(
4658
determineConnectionFactory(connectionFactory, properties.getUsername(), properties.getPassword()),
4759
properties);
4860
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* Copyright 2012-2025 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.sql.init;
18+
19+
import org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer;
20+
import org.springframework.boot.sql.init.DatabaseInitializationSettings;
21+
import org.springframework.context.annotation.ImportRuntimeHints;
22+
23+
/**
24+
* Marker interface for a script-based database initializer that initializes the
25+
* application's database.
26+
*
27+
* @author Andy Wilkinson
28+
* @author Phillip Webb
29+
* @since 4.0.0
30+
* @see AbstractScriptDatabaseInitializer
31+
*/
32+
@ImportRuntimeHints(SqlInitializationScriptsRuntimeHints.class)
33+
public interface ApplicationScriptDatabaseInitializer {
34+
35+
/**
36+
* Adapts {@link SqlInitializationProperties} to
37+
* {@link DatabaseInitializationSettings}.
38+
* @param properties the properties to adapt
39+
* @return the settings
40+
*/
41+
static DatabaseInitializationSettings getSettings(SqlInitializationProperties properties) {
42+
return SettingsCreator.createFrom(properties);
43+
}
44+
45+
}

0 commit comments

Comments
 (0)