Skip to content

Commit ed72bca

Browse files
committed
Provide more pluggable way to indicate DataSource init dependencies
Closes gh-17619 Closes gh-25559
1 parent 99b7d29 commit ed72bca

File tree

40 files changed

+1230
-476
lines changed

40 files changed

+1230
-476
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java

Lines changed: 2 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,13 @@
2626
import java.util.function.Supplier;
2727
import java.util.stream.Collectors;
2828

29-
import javax.persistence.EntityManagerFactory;
3029
import javax.sql.DataSource;
3130

3231
import org.flywaydb.core.Flyway;
3332
import org.flywaydb.core.api.MigrationVersion;
3433
import org.flywaydb.core.api.callback.Callback;
3534
import org.flywaydb.core.api.configuration.FluentConfiguration;
3635
import org.flywaydb.core.api.migration.JavaMigration;
37-
import org.jooq.DSLContext;
3836

3937
import org.springframework.beans.factory.ObjectProvider;
4038
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
@@ -45,35 +43,24 @@
4543
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
4644
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
4745
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayDataSourceCondition;
48-
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayDslContextDependsOnPostProcessor;
49-
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayEntityManagerFactoryDependsOnPostProcessor;
50-
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayJdbcOperationsDependsOnPostProcessor;
51-
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayNamedParameterJdbcOperationsDependencyConfiguration;
5246
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
5347
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
54-
import org.springframework.boot.autoconfigure.jdbc.JdbcOperationsDependsOnPostProcessor;
5548
import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration;
56-
import org.springframework.boot.autoconfigure.jdbc.NamedParameterJdbcOperationsDependsOnPostProcessor;
57-
import org.springframework.boot.autoconfigure.jooq.DslContextDependsOnPostProcessor;
58-
import org.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryDependsOnPostProcessor;
5949
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
6050
import org.springframework.boot.context.properties.ConfigurationPropertiesBinding;
6151
import org.springframework.boot.context.properties.EnableConfigurationProperties;
6252
import org.springframework.boot.context.properties.PropertyMapper;
6353
import org.springframework.boot.jdbc.DatabaseDriver;
54+
import org.springframework.boot.jdbc.init.DataSourceInitializationDependencyConfigurer;
6455
import org.springframework.context.annotation.Bean;
6556
import org.springframework.context.annotation.Conditional;
6657
import org.springframework.context.annotation.Configuration;
6758
import org.springframework.context.annotation.Import;
6859
import org.springframework.core.convert.TypeDescriptor;
6960
import org.springframework.core.convert.converter.GenericConverter;
7061
import org.springframework.core.io.ResourceLoader;
71-
import org.springframework.jdbc.core.JdbcOperations;
72-
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
7362
import org.springframework.jdbc.support.JdbcUtils;
7463
import org.springframework.jdbc.support.MetaDataAccessException;
75-
import org.springframework.orm.jpa.AbstractEntityManagerFactoryBean;
76-
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
7764
import org.springframework.util.CollectionUtils;
7865
import org.springframework.util.ObjectUtils;
7966
import org.springframework.util.StringUtils;
@@ -100,8 +87,7 @@
10087
@ConditionalOnProperty(prefix = "spring.flyway", name = "enabled", matchIfMissing = true)
10188
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, JdbcTemplateAutoConfiguration.class,
10289
HibernateJpaAutoConfiguration.class })
103-
@Import({ FlywayEntityManagerFactoryDependsOnPostProcessor.class, FlywayJdbcOperationsDependsOnPostProcessor.class,
104-
FlywayNamedParameterJdbcOperationsDependencyConfiguration.class, FlywayDslContextDependsOnPostProcessor.class })
90+
@Import(DataSourceInitializationDependencyConfigurer.class)
10591
public class FlywayAutoConfiguration {
10692

10793
@Bean
@@ -118,10 +104,6 @@ public FlywaySchemaManagementProvider flywayDefaultDdlModeProvider(ObjectProvide
118104
@Configuration(proxyBeanMethods = false)
119105
@ConditionalOnMissingBean(Flyway.class)
120106
@EnableConfigurationProperties({ DataSourceProperties.class, FlywayProperties.class })
121-
@Import({ FlywayMigrationInitializerEntityManagerFactoryDependsOnPostProcessor.class,
122-
FlywayMigrationInitializerJdbcOperationsDependsOnPostProcessor.class,
123-
FlywayMigrationInitializerNamedParameterJdbcOperationsDependsOnPostProcessor.class,
124-
FlywayMigrationInitializerDslContextDependsOnPostProcessor.class })
125107
public static class FlywayConfiguration {
126108

127109
@Bean
@@ -325,122 +307,6 @@ public FlywayMigrationInitializer flywayInitializer(Flyway flyway,
325307

326308
}
327309

328-
/**
329-
* Post processor to ensure that {@link EntityManagerFactory} beans depend on any
330-
* {@link FlywayMigrationInitializer} beans.
331-
*/
332-
@ConditionalOnClass(LocalContainerEntityManagerFactoryBean.class)
333-
@ConditionalOnBean(AbstractEntityManagerFactoryBean.class)
334-
static class FlywayMigrationInitializerEntityManagerFactoryDependsOnPostProcessor
335-
extends EntityManagerFactoryDependsOnPostProcessor {
336-
337-
FlywayMigrationInitializerEntityManagerFactoryDependsOnPostProcessor() {
338-
super(FlywayMigrationInitializer.class);
339-
}
340-
341-
}
342-
343-
/**
344-
* Post processor to ensure that {@link JdbcOperations} beans depend on any
345-
* {@link FlywayMigrationInitializer} beans.
346-
*/
347-
@ConditionalOnClass(JdbcOperations.class)
348-
@ConditionalOnBean(JdbcOperations.class)
349-
static class FlywayMigrationInitializerJdbcOperationsDependsOnPostProcessor
350-
extends JdbcOperationsDependsOnPostProcessor {
351-
352-
FlywayMigrationInitializerJdbcOperationsDependsOnPostProcessor() {
353-
super(FlywayMigrationInitializer.class);
354-
}
355-
356-
}
357-
358-
/**
359-
* Post processor to ensure that {@link NamedParameterJdbcOperations} beans depend on
360-
* any {@link FlywayMigrationInitializer} beans.
361-
*/
362-
@ConditionalOnClass(NamedParameterJdbcOperations.class)
363-
@ConditionalOnBean(NamedParameterJdbcOperations.class)
364-
static class FlywayMigrationInitializerNamedParameterJdbcOperationsDependsOnPostProcessor
365-
extends NamedParameterJdbcOperationsDependsOnPostProcessor {
366-
367-
FlywayMigrationInitializerNamedParameterJdbcOperationsDependsOnPostProcessor() {
368-
super(FlywayMigrationInitializer.class);
369-
}
370-
371-
}
372-
373-
/**
374-
* Post processor to ensure that {@link DSLContext} beans depend on any
375-
* {@link FlywayMigrationInitializer} beans.
376-
*/
377-
@ConditionalOnClass(DSLContext.class)
378-
@ConditionalOnBean(DSLContext.class)
379-
static class FlywayMigrationInitializerDslContextDependsOnPostProcessor extends DslContextDependsOnPostProcessor {
380-
381-
FlywayMigrationInitializerDslContextDependsOnPostProcessor() {
382-
super(FlywayMigrationInitializer.class);
383-
}
384-
385-
}
386-
387-
/**
388-
* Post processor to ensure that {@link EntityManagerFactory} beans depend on any
389-
* {@link Flyway} beans.
390-
*/
391-
@ConditionalOnClass(LocalContainerEntityManagerFactoryBean.class)
392-
@ConditionalOnBean(AbstractEntityManagerFactoryBean.class)
393-
static class FlywayEntityManagerFactoryDependsOnPostProcessor extends EntityManagerFactoryDependsOnPostProcessor {
394-
395-
FlywayEntityManagerFactoryDependsOnPostProcessor() {
396-
super(Flyway.class);
397-
}
398-
399-
}
400-
401-
/**
402-
* Post processor to ensure that {@link JdbcOperations} beans depend on any
403-
* {@link Flyway} beans.
404-
*/
405-
@ConditionalOnClass(JdbcOperations.class)
406-
@ConditionalOnBean(JdbcOperations.class)
407-
static class FlywayJdbcOperationsDependsOnPostProcessor extends JdbcOperationsDependsOnPostProcessor {
408-
409-
FlywayJdbcOperationsDependsOnPostProcessor() {
410-
super(Flyway.class);
411-
}
412-
413-
}
414-
415-
/**
416-
* Post processor to ensure that {@link NamedParameterJdbcOperations} beans depend on
417-
* any {@link Flyway} beans.
418-
*/
419-
@ConditionalOnClass(NamedParameterJdbcOperations.class)
420-
@ConditionalOnBean(NamedParameterJdbcOperations.class)
421-
protected static class FlywayNamedParameterJdbcOperationsDependencyConfiguration
422-
extends NamedParameterJdbcOperationsDependsOnPostProcessor {
423-
424-
public FlywayNamedParameterJdbcOperationsDependencyConfiguration() {
425-
super(Flyway.class);
426-
}
427-
428-
}
429-
430-
/**
431-
* Post processor to ensure that {@link DSLContext} beans depend on any {@link Flyway}
432-
* beans.
433-
*/
434-
@ConditionalOnClass(DSLContext.class)
435-
@ConditionalOnBean(DSLContext.class)
436-
protected static class FlywayDslContextDependsOnPostProcessor extends DslContextDependsOnPostProcessor {
437-
438-
public FlywayDslContextDependsOnPostProcessor() {
439-
super(Flyway.class);
440-
}
441-
442-
}
443-
444310
private static class LocationResolver {
445311

446312
private static final String VENDOR_PLACEHOLDER = "{vendor}";
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright 2012-2021 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.flyway;
18+
19+
import java.util.Collections;
20+
import java.util.Set;
21+
22+
import org.springframework.boot.jdbc.init.AbstractBeansOfTypeDataSourceInitializerDetector;
23+
import org.springframework.boot.jdbc.init.DataSourceInitializerDetector;
24+
25+
/**
26+
* A {@link DataSourceInitializerDetector} for {@link FlywayMigrationInitializer}.
27+
*
28+
* @author Andy Wilkinson
29+
*/
30+
class FlywayMigrationInitializerDataSourceInitializerDetector extends AbstractBeansOfTypeDataSourceInitializerDetector {
31+
32+
@Override
33+
protected Set<Class<?>> getDataSourceInitializerBeanTypes() {
34+
return Collections.singleton(FlywayMigrationInitializer.class);
35+
}
36+
37+
}

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

Lines changed: 5 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,13 @@
1616

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

19-
import javax.persistence.EntityManagerFactory;
2019
import javax.sql.DataSource;
2120

22-
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
23-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2421
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
25-
import org.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryDependsOnPostProcessor;
22+
import org.springframework.boot.jdbc.init.DataSourceInitializationDependencyConfigurer;
2623
import org.springframework.context.annotation.Bean;
2724
import org.springframework.context.annotation.Configuration;
2825
import org.springframework.context.annotation.Import;
29-
import org.springframework.jdbc.core.JdbcOperations;
30-
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
31-
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
3226

3327
/**
3428
* Configuration for {@link DataSource} initialization using DDL and DML scripts.
@@ -37,63 +31,12 @@
3731
*/
3832
@Configuration(proxyBeanMethods = false)
3933
@ConditionalOnSingleCandidate(DataSource.class)
34+
@Import(DataSourceInitializationDependencyConfigurer.class)
4035
class DataSourceInitializationConfiguration {
4136

42-
@Configuration(proxyBeanMethods = false)
43-
@ConditionalOnProperty(prefix = "spring.datasource", name = "initialization-order", havingValue = "before-jpa",
44-
matchIfMissing = true)
45-
@Import({ DataSourceInitializationJdbcOperationsDependsOnPostProcessor.class,
46-
DataSourceInitializationNamedParameterJdbcOperationsDependsOnPostProcessor.class,
47-
DataSourceInitializationEntityManagerFactoryDependsOnPostProcessor.class })
48-
static class BeforeJpaDataSourceInitializationConfiguration {
49-
50-
@Bean
51-
DataSourceInitialization dataSourceInitialization(DataSource dataSource, DataSourceProperties properties) {
52-
return new DataSourceInitialization(dataSource, properties);
53-
}
54-
55-
}
56-
57-
/**
58-
* Post processor to ensure that {@link EntityManagerFactory} beans depend on any
59-
* {@link DataSourceInitialization} beans.
60-
*/
61-
@ConditionalOnClass({ LocalContainerEntityManagerFactoryBean.class, EntityManagerFactory.class })
62-
static class DataSourceInitializationEntityManagerFactoryDependsOnPostProcessor
63-
extends EntityManagerFactoryDependsOnPostProcessor {
64-
65-
DataSourceInitializationEntityManagerFactoryDependsOnPostProcessor() {
66-
super(DataSourceInitialization.class);
67-
}
68-
69-
}
70-
71-
/**
72-
* Post processor to ensure that {@link JdbcOperations} beans depend on any
73-
* {@link DataSourceInitialization} beans.
74-
*/
75-
@ConditionalOnClass(JdbcOperations.class)
76-
static class DataSourceInitializationJdbcOperationsDependsOnPostProcessor
77-
extends JdbcOperationsDependsOnPostProcessor {
78-
79-
DataSourceInitializationJdbcOperationsDependsOnPostProcessor() {
80-
super(DataSourceInitialization.class);
81-
}
82-
83-
}
84-
85-
/**
86-
* Post processor to ensure that {@link NamedParameterJdbcOperations} beans depend on
87-
* any {@link DataSourceInitialization} beans.
88-
*/
89-
@ConditionalOnClass(NamedParameterJdbcOperations.class)
90-
protected static class DataSourceInitializationNamedParameterJdbcOperationsDependsOnPostProcessor
91-
extends NamedParameterJdbcOperationsDependsOnPostProcessor {
92-
93-
public DataSourceInitializationNamedParameterJdbcOperationsDependsOnPostProcessor() {
94-
super(DataSourceInitialization.class);
95-
}
96-
37+
@Bean
38+
DataSourceInitialization dataSourceInitialization(DataSource dataSource, DataSourceProperties properties) {
39+
return new DataSourceInitialization(dataSource, properties);
9740
}
9841

9942
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright 2012-2021 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.jdbc;
18+
19+
import java.util.Collections;
20+
import java.util.Set;
21+
22+
import org.springframework.boot.jdbc.init.AbstractBeansOfTypeDataSourceInitializerDetector;
23+
import org.springframework.boot.jdbc.init.DataSourceInitializerDetector;
24+
25+
/**
26+
* A {@link DataSourceInitializerDetector} for {@link DataSourceInitialization}.
27+
*
28+
* @author Andy Wilkinson
29+
*/
30+
class DataSourceInitializationDataSourceInitializerDetector extends AbstractBeansOfTypeDataSourceInitializerDetector {
31+
32+
@Override
33+
protected Set<Class<?>> getDataSourceInitializerBeanTypes() {
34+
return Collections.singleton(DataSourceInitialization.class);
35+
}
36+
37+
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.springframework.beans.factory.config.BeanDefinition;
2020
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
2121
import org.springframework.boot.autoconfigure.AbstractDependsOnBeanFactoryPostProcessor;
22+
import org.springframework.boot.jdbc.init.DependsOnDataSourceInitializationDetector;
2223
import org.springframework.jdbc.core.JdbcOperations;
2324

2425
/**
@@ -32,7 +33,9 @@
3233
* @author Andrii Hrytsiuk
3334
* @since 2.0.4
3435
* @see BeanDefinition#setDependsOn(String[])
36+
* @deprecated since 2.5.0 in favor of {@link DependsOnDataSourceInitializationDetector}
3537
*/
38+
@Deprecated
3639
public class JdbcOperationsDependsOnPostProcessor extends AbstractDependsOnBeanFactoryPostProcessor {
3740

3841
/**

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2424
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
2525
import org.springframework.boot.context.properties.EnableConfigurationProperties;
26+
import org.springframework.boot.jdbc.init.DataSourceInitializationDependencyConfigurer;
2627
import org.springframework.context.annotation.Configuration;
2728
import org.springframework.context.annotation.Import;
2829
import org.springframework.jdbc.core.JdbcTemplate;
@@ -43,7 +44,8 @@
4344
@ConditionalOnSingleCandidate(DataSource.class)
4445
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
4546
@EnableConfigurationProperties(JdbcProperties.class)
46-
@Import({ JdbcTemplateConfiguration.class, NamedParameterJdbcTemplateConfiguration.class })
47+
@Import({ DataSourceInitializationDependencyConfigurer.class, JdbcTemplateConfiguration.class,
48+
NamedParameterJdbcTemplateConfiguration.class })
4749
public class JdbcTemplateAutoConfiguration {
4850

4951
}

0 commit comments

Comments
 (0)