Skip to content

Commit accd3c0

Browse files
committed
Merge branch '2.4.x'
Closes gh-25311
2 parents 5618646 + 0dbf907 commit accd3c0

File tree

5 files changed

+186
-9
lines changed

5 files changed

+186
-9
lines changed

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

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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;
@@ -44,6 +45,7 @@
4445
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
4546
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
4647
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayDataSourceCondition;
48+
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayDslContextDependsOnPostProcessor;
4749
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayEntityManagerFactoryDependsOnPostProcessor;
4850
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayJdbcOperationsDependsOnPostProcessor;
4951
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayNamedParameterJdbcOperationsDependencyConfiguration;
@@ -52,7 +54,11 @@
5254
import org.springframework.boot.autoconfigure.jdbc.JdbcOperationsDependsOnPostProcessor;
5355
import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration;
5456
import org.springframework.boot.autoconfigure.jdbc.NamedParameterJdbcOperationsDependsOnPostProcessor;
57+
<<<<<<< HEAD
5558
import org.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryDependsOnPostProcessor;
59+
=======
60+
import org.springframework.boot.autoconfigure.jooq.DslContextDependsOnPostProcessor;
61+
>>>>>>> 2.4.x
5662
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
5763
import org.springframework.boot.context.properties.ConfigurationPropertiesBinding;
5864
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -97,7 +103,7 @@
97103
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, JdbcTemplateAutoConfiguration.class,
98104
HibernateJpaAutoConfiguration.class })
99105
@Import({ FlywayEntityManagerFactoryDependsOnPostProcessor.class, FlywayJdbcOperationsDependsOnPostProcessor.class,
100-
FlywayNamedParameterJdbcOperationsDependencyConfiguration.class })
106+
FlywayNamedParameterJdbcOperationsDependencyConfiguration.class, FlywayDslContextDependsOnPostProcessor.class })
101107
public class FlywayAutoConfiguration {
102108

103109
@Bean
@@ -116,7 +122,8 @@ public FlywaySchemaManagementProvider flywayDefaultDdlModeProvider(ObjectProvide
116122
@EnableConfigurationProperties({ DataSourceProperties.class, FlywayProperties.class })
117123
@Import({ FlywayMigrationInitializerEntityManagerFactoryDependsOnPostProcessor.class,
118124
FlywayMigrationInitializerJdbcOperationsDependsOnPostProcessor.class,
119-
FlywayMigrationInitializerNamedParameterJdbcOperationsDependsOnPostProcessor.class })
125+
FlywayMigrationInitializerNamedParameterJdbcOperationsDependsOnPostProcessor.class,
126+
FlywayMigrationInitializerDslContextDependsOnPostProcessor.class })
120127
public static class FlywayConfiguration {
121128

122129
@Bean
@@ -357,6 +364,20 @@ static class FlywayMigrationInitializerNamedParameterJdbcOperationsDependsOnPost
357364

358365
}
359366

367+
/**
368+
* Post processor to ensure that {@link DSLContext} beans depend on any
369+
* {@link FlywayMigrationInitializer} beans.
370+
*/
371+
@ConditionalOnClass(DSLContext.class)
372+
@ConditionalOnBean(DSLContext.class)
373+
static class FlywayMigrationInitializerDslContextDependsOnPostProcessor extends DslContextDependsOnPostProcessor {
374+
375+
FlywayMigrationInitializerDslContextDependsOnPostProcessor() {
376+
super(FlywayMigrationInitializer.class);
377+
}
378+
379+
}
380+
360381
/**
361382
* Post processor to ensure that {@link EntityManagerFactory} beans depend on any
362383
* {@link Flyway} beans.
@@ -400,6 +421,20 @@ public FlywayNamedParameterJdbcOperationsDependencyConfiguration() {
400421

401422
}
402423

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

405440
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

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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;
@@ -36,7 +37,9 @@
3637
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
3738
import org.springframework.boot.autoconfigure.jdbc.JdbcOperationsDependsOnPostProcessor;
3839
import org.springframework.boot.autoconfigure.jdbc.NamedParameterJdbcOperationsDependsOnPostProcessor;
40+
import org.springframework.boot.autoconfigure.jooq.DslContextDependsOnPostProcessor;
3941
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration.LiquibaseDataSourceCondition;
42+
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration.LiquibaseDslContextDependsOnPostProcessor;
4043
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration.LiquibaseEntityManagerFactoryDependsOnPostProcessor;
4144
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration.LiquibaseJdbcOperationsDependsOnPostProcessor;
4245
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
@@ -172,8 +176,8 @@ private String getProperty(Supplier<String> property, Supplier<String> defaultVa
172176
}
173177

174178
/**
175-
* Post processor to ensure that {@link EntityManagerFactory} beans depend on the
176-
* liquibase bean.
179+
* Post processor to ensure that {@link EntityManagerFactory} beans depend on any
180+
* {@link SpringLiquibase} beans.
177181
*/
178182
@ConditionalOnClass(LocalContainerEntityManagerFactoryBean.class)
179183
@ConditionalOnBean(AbstractEntityManagerFactoryBean.class)
@@ -187,8 +191,8 @@ static class LiquibaseEntityManagerFactoryDependsOnPostProcessor
187191
}
188192

189193
/**
190-
* Additional configuration to ensure that {@link JdbcOperations} beans depend on the
191-
* liquibase bean.
194+
* Additional configuration to ensure that {@link JdbcOperations} beans depend on any
195+
* {@link SpringLiquibase} beans.
192196
*/
193197
@ConditionalOnClass(JdbcOperations.class)
194198
@ConditionalOnBean(JdbcOperations.class)
@@ -202,7 +206,7 @@ static class LiquibaseJdbcOperationsDependsOnPostProcessor extends JdbcOperation
202206

203207
/**
204208
* Post processor to ensure that {@link NamedParameterJdbcOperations} beans depend on
205-
* the liquibase bean.
209+
* any {@link SpringLiquibase} beans.
206210
*/
207211
@ConditionalOnClass(NamedParameterJdbcOperations.class)
208212
@ConditionalOnBean(NamedParameterJdbcOperations.class)
@@ -215,6 +219,20 @@ static class LiquibaseNamedParameterJdbcOperationsDependsOnPostProcessor
215219

216220
}
217221

222+
/**
223+
* Post processor to ensure that {@link DSLContext} beans depend on any
224+
* {@link SpringLiquibase} beans.
225+
*/
226+
@ConditionalOnClass(DSLContext.class)
227+
@ConditionalOnBean(DSLContext.class)
228+
static class LiquibaseDslContextDependsOnPostProcessor extends DslContextDependsOnPostProcessor {
229+
230+
LiquibaseDslContextDependsOnPostProcessor() {
231+
super(SpringLiquibase.class);
232+
}
233+
234+
}
235+
218236
static final class LiquibaseDataSourceCondition extends AnyNestedCondition {
219237

220238
LiquibaseDataSourceCondition() {

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

Lines changed: 52 additions & 1 deletion
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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.springframework.boot.autoconfigure.AutoConfigurations;
3838
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
3939
import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration;
40+
import org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration;
4041
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
4142
import org.springframework.boot.jdbc.DataSourceBuilder;
4243
import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
@@ -370,6 +371,25 @@ void overrideTag() {
370371
.run(assertLiquibase((liquibase) -> assertThat(liquibase.getTag()).isEqualTo("1.0.0")));
371372
}
372373

374+
@Test
375+
void whenLiquibaseIsAutoConfiguredThenJooqDslContextDependsOnSpringLiquibaseBeans() {
376+
this.contextRunner.withConfiguration(AutoConfigurations.of(JooqAutoConfiguration.class))
377+
.withUserConfiguration(EmbeddedDataSourceConfiguration.class).run((context) -> {
378+
BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext");
379+
assertThat(beanDefinition.getDependsOn()).containsExactly("liquibase");
380+
});
381+
}
382+
383+
@Test
384+
void whenCustomSpringLiquibaseIsDefinedThenJooqDslContextDependsOnSpringLiquibaseBeans() {
385+
this.contextRunner.withConfiguration(AutoConfigurations.of(JooqAutoConfiguration.class))
386+
.withUserConfiguration(LiquibaseUserConfiguration.class, EmbeddedDataSourceConfiguration.class)
387+
.run((context) -> {
388+
BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext");
389+
assertThat(beanDefinition.getDependsOn()).containsExactly("springLiquibase");
390+
});
391+
}
392+
373393
private ContextConsumer<AssertableApplicationContext> assertLiquibase(Consumer<SpringLiquibase> consumer) {
374394
return (context) -> {
375395
assertThat(context).hasSingleBean(SpringLiquibase.class);

0 commit comments

Comments
 (0)