Skip to content

Commit ca4b00a

Browse files
committed
Introduce a shared abstraction for database initialization
Currently used by Spring Batch, Spring Integration, Spring Session and Quartz. Signed-off-by: Yanming Zhou <zhouyanming@gmail.com>
1 parent 571db64 commit ca4b00a

13 files changed

+261
-359
lines changed

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

Lines changed: 5 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,10 @@
1616

1717
package org.springframework.boot.autoconfigure.batch;
1818

19-
import java.util.List;
20-
2119
import javax.sql.DataSource;
2220

2321
import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer;
24-
import org.springframework.boot.jdbc.init.PlatformPlaceholderDatabaseDriverResolver;
25-
import org.springframework.boot.sql.init.DatabaseInitializationSettings;
26-
import org.springframework.util.StringUtils;
22+
import org.springframework.boot.jdbc.init.PropertiesBasedDataSourceScriptDatabaseInitializer;
2723

2824
/**
2925
* {@link DataSourceScriptDatabaseInitializer} for the Spring Batch database. May be
@@ -33,54 +29,19 @@
3329
* @author Vedran Pavic
3430
* @author Andy Wilkinson
3531
* @author Phillip Webb
32+
* @author Yanming Zhou
3633
* @since 2.6.0
3734
*/
38-
public class BatchDataSourceScriptDatabaseInitializer extends DataSourceScriptDatabaseInitializer {
35+
public class BatchDataSourceScriptDatabaseInitializer
36+
extends PropertiesBasedDataSourceScriptDatabaseInitializer<BatchProperties.Jdbc> {
3937

4038
/**
4139
* Create a new {@link BatchDataSourceScriptDatabaseInitializer} instance.
4240
* @param dataSource the Spring Batch data source
4341
* @param properties the Spring Batch JDBC properties
44-
* @see #getSettings
4542
*/
4643
public BatchDataSourceScriptDatabaseInitializer(DataSource dataSource, BatchProperties.Jdbc properties) {
47-
this(dataSource, getSettings(dataSource, properties));
48-
}
49-
50-
/**
51-
* Create a new {@link BatchDataSourceScriptDatabaseInitializer} instance.
52-
* @param dataSource the Spring Batch data source
53-
* @param settings the database initialization settings
54-
* @see #getSettings
55-
*/
56-
public BatchDataSourceScriptDatabaseInitializer(DataSource dataSource, DatabaseInitializationSettings settings) {
57-
super(dataSource, settings);
58-
}
59-
60-
/**
61-
* Adapts {@link BatchProperties.Jdbc Spring Batch JDBC properties} to
62-
* {@link DatabaseInitializationSettings} replacing any {@literal @@platform@@}
63-
* placeholders.
64-
* @param dataSource the Spring Batch data source
65-
* @param properties batch JDBC properties
66-
* @return a new {@link DatabaseInitializationSettings} instance
67-
* @see #BatchDataSourceScriptDatabaseInitializer(DataSource,
68-
* DatabaseInitializationSettings)
69-
*/
70-
public static DatabaseInitializationSettings getSettings(DataSource dataSource, BatchProperties.Jdbc properties) {
71-
DatabaseInitializationSettings settings = new DatabaseInitializationSettings();
72-
settings.setSchemaLocations(resolveSchemaLocations(dataSource, properties));
73-
settings.setMode(properties.getInitializeSchema());
74-
settings.setContinueOnError(true);
75-
return settings;
76-
}
77-
78-
private static List<String> resolveSchemaLocations(DataSource dataSource, BatchProperties.Jdbc properties) {
79-
PlatformPlaceholderDatabaseDriverResolver platformResolver = new PlatformPlaceholderDatabaseDriverResolver();
80-
if (StringUtils.hasText(properties.getPlatform())) {
81-
return platformResolver.resolveAll(properties.getPlatform(), properties.getSchema());
82-
}
83-
return platformResolver.resolveAll(dataSource, properties.getSchema());
44+
super(dataSource, properties);
8445
}
8546

8647
}

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

Lines changed: 5 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
package org.springframework.boot.autoconfigure.batch;
1818

1919
import org.springframework.boot.context.properties.ConfigurationProperties;
20-
import org.springframework.boot.sql.init.DatabaseInitializationMode;
20+
import org.springframework.boot.jdbc.init.DatabaseInitializationProperties;
2121
import org.springframework.transaction.annotation.Isolation;
2222

2323
/**
@@ -63,7 +63,7 @@ public void setName(String name) {
6363

6464
}
6565

66-
public static class Jdbc {
66+
public static class Jdbc extends DatabaseInitializationProperties {
6767

6868
private static final String DEFAULT_SCHEMA_LOCATION = "classpath:org/springframework/"
6969
+ "batch/core/schema-@@platform@@.sql";
@@ -78,27 +78,11 @@ public static class Jdbc {
7878
*/
7979
private Isolation isolationLevelForCreate;
8080

81-
/**
82-
* Path to the SQL file to use to initialize the database schema.
83-
*/
84-
private String schema = DEFAULT_SCHEMA_LOCATION;
85-
86-
/**
87-
* Platform to use in initialization scripts if the @@platform@@ placeholder is
88-
* used. Auto-detected by default.
89-
*/
90-
private String platform;
91-
9281
/**
9382
* Table prefix for all the batch meta-data tables.
9483
*/
9584
private String tablePrefix;
9685

97-
/**
98-
* Database schema initialization mode.
99-
*/
100-
private DatabaseInitializationMode initializeSchema = DatabaseInitializationMode.EMBEDDED;
101-
10286
public boolean isValidateTransactionState() {
10387
return this.validateTransactionState;
10488
}
@@ -115,22 +99,6 @@ public void setIsolationLevelForCreate(Isolation isolationLevelForCreate) {
11599
this.isolationLevelForCreate = isolationLevelForCreate;
116100
}
117101

118-
public String getSchema() {
119-
return this.schema;
120-
}
121-
122-
public void setSchema(String schema) {
123-
this.schema = schema;
124-
}
125-
126-
public String getPlatform() {
127-
return this.platform;
128-
}
129-
130-
public void setPlatform(String platform) {
131-
this.platform = platform;
132-
}
133-
134102
public String getTablePrefix() {
135103
return this.tablePrefix;
136104
}
@@ -139,12 +107,9 @@ public void setTablePrefix(String tablePrefix) {
139107
this.tablePrefix = tablePrefix;
140108
}
141109

142-
public DatabaseInitializationMode getInitializeSchema() {
143-
return this.initializeSchema;
144-
}
145-
146-
public void setInitializeSchema(DatabaseInitializationMode initializeSchema) {
147-
this.initializeSchema = initializeSchema;
110+
@Override
111+
public String getDefaultSchemaLocation() {
112+
return DEFAULT_SCHEMA_LOCATION;
148113
}
149114

150115
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2022 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.
@@ -16,25 +16,25 @@
1616

1717
package org.springframework.boot.autoconfigure.integration;
1818

19-
import java.util.List;
19+
import java.util.Map;
2020

2121
import javax.sql.DataSource;
2222

2323
import org.springframework.boot.jdbc.DatabaseDriver;
2424
import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer;
25-
import org.springframework.boot.jdbc.init.PlatformPlaceholderDatabaseDriverResolver;
26-
import org.springframework.boot.sql.init.DatabaseInitializationSettings;
27-
import org.springframework.util.StringUtils;
25+
import org.springframework.boot.jdbc.init.PropertiesBasedDataSourceScriptDatabaseInitializer;
2826

2927
/**
3028
* {@link DataSourceScriptDatabaseInitializer} for the Spring Integration database. May be
3129
* registered as a bean to override auto-configuration.
3230
*
3331
* @author Vedran Pavic
3432
* @author Andy Wilkinson
33+
* @author Yanming Zhou
3534
* @since 2.6.0
3635
*/
37-
public class IntegrationDataSourceScriptDatabaseInitializer extends DataSourceScriptDatabaseInitializer {
36+
public class IntegrationDataSourceScriptDatabaseInitializer
37+
extends PropertiesBasedDataSourceScriptDatabaseInitializer<IntegrationProperties.Jdbc> {
3838

3939
/**
4040
* Create a new {@link IntegrationDataSourceScriptDatabaseInitializer} instance.
@@ -44,45 +44,7 @@ public class IntegrationDataSourceScriptDatabaseInitializer extends DataSourceSc
4444
*/
4545
public IntegrationDataSourceScriptDatabaseInitializer(DataSource dataSource,
4646
IntegrationProperties.Jdbc properties) {
47-
this(dataSource, getSettings(dataSource, properties));
48-
}
49-
50-
/**
51-
* Create a new {@link IntegrationDataSourceScriptDatabaseInitializer} instance.
52-
* @param dataSource the Spring Integration data source
53-
* @param settings the database initialization settings
54-
* @see #getSettings
55-
*/
56-
public IntegrationDataSourceScriptDatabaseInitializer(DataSource dataSource,
57-
DatabaseInitializationSettings settings) {
58-
super(dataSource, settings);
59-
}
60-
61-
/**
62-
* Adapts {@link IntegrationProperties.Jdbc Spring Integration JDBC properties} to
63-
* {@link DatabaseInitializationSettings} replacing any {@literal @@platform@@}
64-
* placeholders.
65-
* @param dataSource the Spring Integration data source
66-
* @param properties the Spring Integration JDBC properties
67-
* @return a new {@link DatabaseInitializationSettings} instance
68-
* @see #IntegrationDataSourceScriptDatabaseInitializer(DataSource,
69-
* DatabaseInitializationSettings)
70-
*/
71-
static DatabaseInitializationSettings getSettings(DataSource dataSource, IntegrationProperties.Jdbc properties) {
72-
DatabaseInitializationSettings settings = new DatabaseInitializationSettings();
73-
settings.setSchemaLocations(resolveSchemaLocations(dataSource, properties));
74-
settings.setMode(properties.getInitializeSchema());
75-
settings.setContinueOnError(true);
76-
return settings;
77-
}
78-
79-
private static List<String> resolveSchemaLocations(DataSource dataSource, IntegrationProperties.Jdbc properties) {
80-
PlatformPlaceholderDatabaseDriverResolver platformResolver = new PlatformPlaceholderDatabaseDriverResolver();
81-
platformResolver = platformResolver.withDriverPlatform(DatabaseDriver.MARIADB, "mysql");
82-
if (StringUtils.hasText(properties.getPlatform())) {
83-
return platformResolver.resolveAll(properties.getPlatform(), properties.getSchema());
84-
}
85-
return platformResolver.resolveAll(dataSource, properties.getSchema());
47+
super(dataSource, properties, Map.of(DatabaseDriver.MARIADB, "mysql"));
8648
}
8749

8850
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/integration/IntegrationProperties.java

Lines changed: 6 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,15 @@
2222
import java.util.List;
2323

2424
import org.springframework.boot.context.properties.ConfigurationProperties;
25-
import org.springframework.boot.sql.init.DatabaseInitializationMode;
25+
import org.springframework.boot.jdbc.init.DatabaseInitializationProperties;
2626

2727
/**
2828
* Configuration properties for Spring Integration.
2929
*
3030
* @author Vedran Pavic
3131
* @author Stephane Nicoll
3232
* @author Artem Bilan
33+
* @author Yanming Zhou
3334
* @since 2.0.0
3435
*/
3536
@ConfigurationProperties("spring.integration")
@@ -212,49 +213,14 @@ public void setIgnoreFailures(boolean ignoreFailures) {
212213

213214
}
214215

215-
public static class Jdbc {
216+
public static class Jdbc extends DatabaseInitializationProperties {
216217

217218
private static final String DEFAULT_SCHEMA_LOCATION = "classpath:org/springframework/"
218219
+ "integration/jdbc/schema-@@platform@@.sql";
219220

220-
/**
221-
* Path to the SQL file to use to initialize the database schema.
222-
*/
223-
private String schema = DEFAULT_SCHEMA_LOCATION;
224-
225-
/**
226-
* Platform to use in initialization scripts if the @@platform@@ placeholder is
227-
* used. Auto-detected by default.
228-
*/
229-
private String platform;
230-
231-
/**
232-
* Database schema initialization mode.
233-
*/
234-
private DatabaseInitializationMode initializeSchema = DatabaseInitializationMode.EMBEDDED;
235-
236-
public String getSchema() {
237-
return this.schema;
238-
}
239-
240-
public void setSchema(String schema) {
241-
this.schema = schema;
242-
}
243-
244-
public String getPlatform() {
245-
return this.platform;
246-
}
247-
248-
public void setPlatform(String platform) {
249-
this.platform = platform;
250-
}
251-
252-
public DatabaseInitializationMode getInitializeSchema() {
253-
return this.initializeSchema;
254-
}
255-
256-
public void setInitializeSchema(DatabaseInitializationMode initializeSchema) {
257-
this.initializeSchema = initializeSchema;
221+
@Override
222+
public String getDefaultSchemaLocation() {
223+
return DEFAULT_SCHEMA_LOCATION;
258224
}
259225

260226
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/quartz/QuartzAutoConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
*
5656
* @author Vedran Pavic
5757
* @author Stephane Nicoll
58+
* @author Yanming Zhou
5859
* @since 2.0.0
5960
*/
6061
@AutoConfiguration(after = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class,
@@ -138,7 +139,7 @@ public QuartzDataSourceScriptDatabaseInitializer quartzDataSourceScriptDatabaseI
138139
DataSource dataSource, @QuartzDataSource ObjectProvider<DataSource> quartzDataSource,
139140
QuartzProperties properties) {
140141
DataSource dataSourceToUse = getDataSource(dataSource, quartzDataSource);
141-
return new QuartzDataSourceScriptDatabaseInitializer(dataSourceToUse, properties);
142+
return new QuartzDataSourceScriptDatabaseInitializer(dataSourceToUse, properties.getJdbc());
142143
}
143144

144145
static class OnQuartzDatasourceInitializationCondition extends OnDatabaseInitializationCondition {

0 commit comments

Comments
 (0)