Skip to content

Commit 0dbf907

Browse files
committed
Merge branch '2.3.x' into 2.4.x
Closes gh-25310
2 parents b86351d + e15c5d3 commit 0dbf907

File tree

5 files changed

+185
-11
lines changed

5 files changed

+185
-11
lines changed

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

+35-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2020 the original author or authors.
2+
* Copyright 2012-2021 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.
@@ -34,6 +34,7 @@
3434
import org.flywaydb.core.api.callback.Callback;
3535
import org.flywaydb.core.api.configuration.FluentConfiguration;
3636
import org.flywaydb.core.api.migration.JavaMigration;
37+
import org.jooq.DSLContext;
3738

3839
import org.springframework.beans.factory.ObjectProvider;
3940
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
@@ -45,6 +46,7 @@
4546
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
4647
import org.springframework.boot.autoconfigure.data.jpa.EntityManagerFactoryDependsOnPostProcessor;
4748
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayDataSourceCondition;
49+
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayDslContextDependsOnPostProcessor;
4850
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayEntityManagerFactoryDependsOnPostProcessor;
4951
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayJdbcOperationsDependsOnPostProcessor;
5052
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayNamedParameterJdbcOperationsDependencyConfiguration;
@@ -53,6 +55,7 @@
5355
import org.springframework.boot.autoconfigure.jdbc.JdbcOperationsDependsOnPostProcessor;
5456
import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration;
5557
import org.springframework.boot.autoconfigure.jdbc.NamedParameterJdbcOperationsDependsOnPostProcessor;
58+
import org.springframework.boot.autoconfigure.jooq.DslContextDependsOnPostProcessor;
5659
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
5760
import org.springframework.boot.context.properties.ConfigurationPropertiesBinding;
5861
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -97,7 +100,7 @@
97100
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, JdbcTemplateAutoConfiguration.class,
98101
HibernateJpaAutoConfiguration.class })
99102
@Import({ FlywayEntityManagerFactoryDependsOnPostProcessor.class, FlywayJdbcOperationsDependsOnPostProcessor.class,
100-
FlywayNamedParameterJdbcOperationsDependencyConfiguration.class })
103+
FlywayNamedParameterJdbcOperationsDependencyConfiguration.class, FlywayDslContextDependsOnPostProcessor.class })
101104
public class FlywayAutoConfiguration {
102105

103106
@Bean
@@ -116,7 +119,8 @@ public FlywaySchemaManagementProvider flywayDefaultDdlModeProvider(ObjectProvide
116119
@EnableConfigurationProperties({ DataSourceProperties.class, FlywayProperties.class })
117120
@Import({ FlywayMigrationInitializerEntityManagerFactoryDependsOnPostProcessor.class,
118121
FlywayMigrationInitializerJdbcOperationsDependsOnPostProcessor.class,
119-
FlywayMigrationInitializerNamedParameterJdbcOperationsDependsOnPostProcessor.class })
122+
FlywayMigrationInitializerNamedParameterJdbcOperationsDependsOnPostProcessor.class,
123+
FlywayMigrationInitializerDslContextDependsOnPostProcessor.class })
120124
public static class FlywayConfiguration {
121125

122126
@Bean
@@ -357,6 +361,20 @@ static class FlywayMigrationInitializerNamedParameterJdbcOperationsDependsOnPost
357361

358362
}
359363

364+
/**
365+
* Post processor to ensure that {@link DSLContext} beans depend on any
366+
* {@link FlywayMigrationInitializer} beans.
367+
*/
368+
@ConditionalOnClass(DSLContext.class)
369+
@ConditionalOnBean(DSLContext.class)
370+
static class FlywayMigrationInitializerDslContextDependsOnPostProcessor extends DslContextDependsOnPostProcessor {
371+
372+
FlywayMigrationInitializerDslContextDependsOnPostProcessor() {
373+
super(FlywayMigrationInitializer.class);
374+
}
375+
376+
}
377+
360378
/**
361379
* Post processor to ensure that {@link EntityManagerFactory} beans depend on any
362380
* {@link Flyway} beans.
@@ -400,6 +418,20 @@ public FlywayNamedParameterJdbcOperationsDependencyConfiguration() {
400418

401419
}
402420

421+
/**
422+
* Post processor to ensure that {@link DSLContext} beans depend on any {@link Flyway}
423+
* beans.
424+
*/
425+
@ConditionalOnClass(DSLContext.class)
426+
@ConditionalOnBean(DSLContext.class)
427+
protected static class FlywayDslContextDependsOnPostProcessor extends DslContextDependsOnPostProcessor {
428+
429+
public FlywayDslContextDependsOnPostProcessor() {
430+
super(Flyway.class);
431+
}
432+
433+
}
434+
403435
private static class LocationResolver {
404436

405437
private static final String VENDOR_PLACEHOLDER = "{vendor}";
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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.jooq;
18+
19+
import org.jooq.DSLContext;
20+
21+
import org.springframework.beans.factory.config.BeanDefinition;
22+
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
23+
import org.springframework.boot.autoconfigure.AbstractDependsOnBeanFactoryPostProcessor;
24+
25+
/**
26+
* {@link BeanFactoryPostProcessor} that can be used to dynamically declare that all
27+
* {@link DSLContext} beans should "depend on" one or more specific beans.
28+
*
29+
* @author Eddú Meléndez
30+
* @since 2.3.9
31+
* @see BeanDefinition#setDependsOn(String[])
32+
*/
33+
public class DslContextDependsOnPostProcessor extends AbstractDependsOnBeanFactoryPostProcessor {
34+
35+
/**
36+
* Creates a new {@code DslContextDependsOnPostProcessor} that will set up
37+
* dependencies upon beans with the given names.
38+
* @param dependsOn names of the beans to depend upon
39+
*/
40+
public DslContextDependsOnPostProcessor(String... dependsOn) {
41+
super(DSLContext.class, dependsOn);
42+
}
43+
44+
/**
45+
* Creates a new {@code DslContextDependsOnPostProcessor} that will set up
46+
* dependencies upon beans with the given types.
47+
* @param dependsOn types of the beans to depend upon
48+
*/
49+
public DslContextDependsOnPostProcessor(Class<?>... dependsOn) {
50+
super(DSLContext.class, dependsOn);
51+
}
52+
53+
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration.java

+25-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2020 the original author or authors.
2+
* Copyright 2012-2021 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.
@@ -23,6 +23,7 @@
2323

2424
import liquibase.change.DatabaseChange;
2525
import liquibase.integration.spring.SpringLiquibase;
26+
import org.jooq.DSLContext;
2627

2728
import org.springframework.beans.factory.ObjectProvider;
2829
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
@@ -37,7 +38,9 @@
3738
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
3839
import org.springframework.boot.autoconfigure.jdbc.JdbcOperationsDependsOnPostProcessor;
3940
import org.springframework.boot.autoconfigure.jdbc.NamedParameterJdbcOperationsDependsOnPostProcessor;
41+
import org.springframework.boot.autoconfigure.jooq.DslContextDependsOnPostProcessor;
4042
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration.LiquibaseDataSourceCondition;
43+
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration.LiquibaseDslContextDependsOnPostProcessor;
4144
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration.LiquibaseEntityManagerFactoryDependsOnPostProcessor;
4245
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration.LiquibaseJdbcOperationsDependsOnPostProcessor;
4346
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration.LiquibaseNamedParameterJdbcOperationsDependsOnPostProcessor;
@@ -78,7 +81,8 @@
7881
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class })
7982
@Import({ LiquibaseEntityManagerFactoryDependsOnPostProcessor.class,
8083
LiquibaseJdbcOperationsDependsOnPostProcessor.class,
81-
LiquibaseNamedParameterJdbcOperationsDependsOnPostProcessor.class })
84+
LiquibaseNamedParameterJdbcOperationsDependsOnPostProcessor.class,
85+
LiquibaseDslContextDependsOnPostProcessor.class })
8286
public class LiquibaseAutoConfiguration {
8387

8488
@Bean
@@ -177,8 +181,8 @@ private String getProperty(Supplier<String> property, Supplier<String> defaultVa
177181
}
178182

179183
/**
180-
* Post processor to ensure that {@link EntityManagerFactory} beans depend on the
181-
* liquibase bean.
184+
* Post processor to ensure that {@link EntityManagerFactory} beans depend on any
185+
* {@link SpringLiquibase} beans.
182186
*/
183187
@ConditionalOnClass(LocalContainerEntityManagerFactoryBean.class)
184188
@ConditionalOnBean(AbstractEntityManagerFactoryBean.class)
@@ -192,8 +196,8 @@ static class LiquibaseEntityManagerFactoryDependsOnPostProcessor
192196
}
193197

194198
/**
195-
* Additional configuration to ensure that {@link JdbcOperations} beans depend on the
196-
* liquibase bean.
199+
* Additional configuration to ensure that {@link JdbcOperations} beans depend on any
200+
* {@link SpringLiquibase} beans.
197201
*/
198202
@ConditionalOnClass(JdbcOperations.class)
199203
@ConditionalOnBean(JdbcOperations.class)
@@ -207,7 +211,7 @@ static class LiquibaseJdbcOperationsDependsOnPostProcessor extends JdbcOperation
207211

208212
/**
209213
* Post processor to ensure that {@link NamedParameterJdbcOperations} beans depend on
210-
* the liquibase bean.
214+
* any {@link SpringLiquibase} beans.
211215
*/
212216
@ConditionalOnClass(NamedParameterJdbcOperations.class)
213217
@ConditionalOnBean(NamedParameterJdbcOperations.class)
@@ -220,6 +224,20 @@ static class LiquibaseNamedParameterJdbcOperationsDependsOnPostProcessor
220224

221225
}
222226

227+
/**
228+
* Post processor to ensure that {@link DSLContext} beans depend on any
229+
* {@link SpringLiquibase} beans.
230+
*/
231+
@ConditionalOnClass(DSLContext.class)
232+
@ConditionalOnBean(DSLContext.class)
233+
static class LiquibaseDslContextDependsOnPostProcessor extends DslContextDependsOnPostProcessor {
234+
235+
LiquibaseDslContextDependsOnPostProcessor() {
236+
super(SpringLiquibase.class);
237+
}
238+
239+
}
240+
223241
static final class LiquibaseDataSourceCondition extends AnyNestedCondition {
224242

225243
LiquibaseDataSourceCondition() {

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java

+52-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2020 the original author or authors.
2+
* Copyright 2012-2021 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.
@@ -32,11 +32,15 @@
3232
import org.flywaydb.core.api.migration.JavaMigration;
3333
import org.flywaydb.core.internal.license.FlywayTeamsUpgradeRequiredException;
3434
import org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform;
35+
import org.jooq.DSLContext;
36+
import org.jooq.SQLDialect;
37+
import org.jooq.impl.DefaultDSLContext;
3538
import org.junit.jupiter.api.Test;
3639
import org.junit.jupiter.api.extension.ExtendWith;
3740
import org.mockito.InOrder;
3841

3942
import org.springframework.beans.factory.BeanCreationException;
43+
import org.springframework.beans.factory.config.BeanDefinition;
4044
import org.springframework.boot.autoconfigure.AutoConfigurations;
4145
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
4246
import org.springframework.boot.jdbc.DataSourceBuilder;
@@ -585,6 +589,33 @@ void skipExecutingMigrationsIsCorrectlyMapped() {
585589
});
586590
}
587591

592+
@Test
593+
void whenFlywayIsAutoConfiguredThenJooqDslContextDependsOnFlywayBeans() {
594+
this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class, JooqConfiguration.class)
595+
.run((context) -> {
596+
BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext");
597+
assertThat(beanDefinition.getDependsOn()).containsExactly("flywayInitializer", "flyway");
598+
});
599+
}
600+
601+
@Test
602+
void whenCustomMigrationInitializerIsDefinedThenJooqDslContextDependsOnIt() {
603+
this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class, JooqConfiguration.class,
604+
CustomFlywayMigrationInitializer.class).run((context) -> {
605+
BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext");
606+
assertThat(beanDefinition.getDependsOn()).containsExactly("flywayMigrationInitializer", "flyway");
607+
});
608+
}
609+
610+
@Test
611+
void whenCustomFlywayIsDefinedThenJooqDslContextDependsOnIt() {
612+
this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class, JooqConfiguration.class,
613+
CustomFlyway.class).run((context) -> {
614+
BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext");
615+
assertThat(beanDefinition.getDependsOn()).containsExactly("customFlyway");
616+
});
617+
}
618+
588619
@Configuration(proxyBeanMethods = false)
589620
static class FlywayDataSourceConfiguration {
590621

@@ -661,6 +692,16 @@ FlywayMigrationInitializer flywayMigrationInitializer(Flyway flyway) {
661692

662693
}
663694

695+
@Configuration(proxyBeanMethods = false)
696+
static class CustomFlyway {
697+
698+
@Bean
699+
Flyway customFlyway() {
700+
return Flyway.configure().load();
701+
}
702+
703+
}
704+
664705
@Configuration(proxyBeanMethods = false)
665706
static class CustomFlywayMigrationInitializerWithJpaConfiguration {
666707

@@ -812,6 +853,16 @@ FlywayConfigurationCustomizer customizerTwo() {
812853

813854
}
814855

856+
@Configuration(proxyBeanMethods = false)
857+
static class JooqConfiguration {
858+
859+
@Bean
860+
DSLContext dslContext() {
861+
return new DefaultDSLContext(SQLDialect.H2);
862+
}
863+
864+
}
865+
815866
static final class CustomClassLoader extends ClassLoader {
816867

817868
private CustomClassLoader(ClassLoader parent) {

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfigurationTests.java

+20
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.springframework.boot.autoconfigure.AutoConfigurations;
4343
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
4444
import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration;
45+
import org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration;
4546
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
4647
import org.springframework.boot.context.event.ApplicationStartingEvent;
4748
import org.springframework.boot.jdbc.DataSourceBuilder;
@@ -408,6 +409,25 @@ void overrideTag() {
408409
.run(assertLiquibase((liquibase) -> assertThat(liquibase.getTag()).isEqualTo("1.0.0")));
409410
}
410411

412+
@Test
413+
void whenLiquibaseIsAutoConfiguredThenJooqDslContextDependsOnSpringLiquibaseBeans() {
414+
this.contextRunner.withConfiguration(AutoConfigurations.of(JooqAutoConfiguration.class))
415+
.withUserConfiguration(EmbeddedDataSourceConfiguration.class).run((context) -> {
416+
BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext");
417+
assertThat(beanDefinition.getDependsOn()).containsExactly("liquibase");
418+
});
419+
}
420+
421+
@Test
422+
void whenCustomSpringLiquibaseIsDefinedThenJooqDslContextDependsOnSpringLiquibaseBeans() {
423+
this.contextRunner.withConfiguration(AutoConfigurations.of(JooqAutoConfiguration.class))
424+
.withUserConfiguration(LiquibaseUserConfiguration.class, EmbeddedDataSourceConfiguration.class)
425+
.run((context) -> {
426+
BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext");
427+
assertThat(beanDefinition.getDependsOn()).containsExactly("springLiquibase");
428+
});
429+
}
430+
411431
private ContextConsumer<AssertableApplicationContext> assertLiquibase(Consumer<SpringLiquibase> consumer) {
412432
return (context) -> {
413433
assertThat(context).hasSingleBean(SpringLiquibase.class);

0 commit comments

Comments
 (0)