From 03828e0b17ae25c831a737fea7f17ebd6879f0cf Mon Sep 17 00:00:00 2001 From: sverma1-godaddy Date: Sun, 12 Oct 2025 22:42:33 +0530 Subject: [PATCH 1/2] BAEL-9453 by sgrverma23: changes of ways to configure the Order of Configuration in Spring Boot --- spring-boot-modules/pom.xml | 3 +- .../spring-boot-config-order/pom.xml | 43 +++++++++++++++++++ .../application/BeanOrderApplication.java | 16 +++++++ .../autoconfig/FirstAutoConfig.java | 16 +++++++ .../autoconfig/SecondAutoConfig.java | 15 +++++++ .../application/defaultconfig/ConfigA.java | 13 ++++++ .../application/defaultconfig/ConfigB.java | 13 ++++++ .../dependsonconfig/DependsConfig.java | 20 +++++++++ .../application/orderbased/ConfigOne.java | 15 +++++++ .../application/orderbased/ConfigTwo.java | 15 +++++++ .../autoconfig/AutoConfigOrderTest.java | 26 +++++++++++ .../defaultconfig/DefaultConfigOrderTest.java | 23 ++++++++++ .../dependsonconfig/DependsConfigTest.java | 26 +++++++++++ .../orderbased/OrderedConfigTest.java | 27 ++++++++++++ 14 files changed, 270 insertions(+), 1 deletion(-) create mode 100644 spring-boot-modules/spring-boot-config-order/pom.xml create mode 100644 spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/BeanOrderApplication.java create mode 100644 spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/autoconfig/FirstAutoConfig.java create mode 100644 spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/autoconfig/SecondAutoConfig.java create mode 100644 spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/defaultconfig/ConfigA.java create mode 100644 spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/defaultconfig/ConfigB.java create mode 100644 spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/dependsonconfig/DependsConfig.java create mode 100644 spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/orderbased/ConfigOne.java create mode 100644 spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/orderbased/ConfigTwo.java create mode 100644 spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/autoconfig/AutoConfigOrderTest.java create mode 100644 spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/defaultconfig/DefaultConfigOrderTest.java create mode 100644 spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/dependsonconfig/DependsConfigTest.java create mode 100644 spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/orderbased/OrderedConfigTest.java diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 9f248895ebed..655bcb67cf26 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -20,6 +20,7 @@ flyway-multidb-springboot spring-boot-admin spring-boot-angular + spring-boot-config-order spring-boot-annotations spring-boot-annotations-2 spring-boot-artifacts @@ -167,4 +168,4 @@ - \ No newline at end of file + diff --git a/spring-boot-modules/spring-boot-config-order/pom.xml b/spring-boot-modules/spring-boot-config-order/pom.xml new file mode 100644 index 000000000000..bd2dd1b5e90d --- /dev/null +++ b/spring-boot-modules/spring-boot-config-order/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + com.baeldung.springbootconfigorder + spring-boot-config-order + 1.0 + spring-boot-config-order + jar + + + com.baeldung.spring-boot-modules + spring-boot-modules + 1.0.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + com.baeldung.Application + + + diff --git a/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/BeanOrderApplication.java b/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/BeanOrderApplication.java new file mode 100644 index 000000000000..eec13db1aa7d --- /dev/null +++ b/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/BeanOrderApplication.java @@ -0,0 +1,16 @@ +package com.baeldung.application; + +import com.baeldung.application.defaultconfig.ConfigA; +import com.baeldung.application.defaultconfig.ConfigB; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class BeanOrderApplication { + + public static void main(String[] args) { + SpringApplication.run(new Class[]{BeanOrderApplication.class, ConfigA.class, ConfigB.class}, + args); + } + +} diff --git a/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/autoconfig/FirstAutoConfig.java b/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/autoconfig/FirstAutoConfig.java new file mode 100644 index 000000000000..92029ed03c1c --- /dev/null +++ b/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/autoconfig/FirstAutoConfig.java @@ -0,0 +1,16 @@ +package com.baeldung.application.autoconfig; + +import org.springframework.boot.autoconfigure.AutoConfigureOrder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@AutoConfigureOrder(1) +public class FirstAutoConfig { + + @Bean + public String autoBeanOne() { + return "AutoBeanOne"; + } +} + diff --git a/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/autoconfig/SecondAutoConfig.java b/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/autoconfig/SecondAutoConfig.java new file mode 100644 index 000000000000..56bb4449c2e6 --- /dev/null +++ b/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/autoconfig/SecondAutoConfig.java @@ -0,0 +1,15 @@ +package com.baeldung.application.autoconfig; + +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@AutoConfigureAfter(FirstAutoConfig.class) +public class SecondAutoConfig { + + @Bean + public String autoBeanTwo() { + return "AutoBeanTwoAfterOne"; + } +} diff --git a/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/defaultconfig/ConfigA.java b/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/defaultconfig/ConfigA.java new file mode 100644 index 000000000000..e75c1de1cdc1 --- /dev/null +++ b/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/defaultconfig/ConfigA.java @@ -0,0 +1,13 @@ +package com.baeldung.application.defaultconfig; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ConfigA { + + @Bean + public String beanA() { + return "Bean A"; + } +} diff --git a/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/defaultconfig/ConfigB.java b/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/defaultconfig/ConfigB.java new file mode 100644 index 000000000000..7ff6f1f11724 --- /dev/null +++ b/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/defaultconfig/ConfigB.java @@ -0,0 +1,13 @@ +package com.baeldung.application.defaultconfig; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ConfigB { + + @Bean + public String beanB() { + return "Bean B"; + } +} diff --git a/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/dependsonconfig/DependsConfig.java b/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/dependsonconfig/DependsConfig.java new file mode 100644 index 000000000000..c01e5cbdacac --- /dev/null +++ b/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/dependsonconfig/DependsConfig.java @@ -0,0 +1,20 @@ +package com.baeldung.application.dependsonconfig; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.DependsOn; + +@Configuration +public class DependsConfig { + + @Bean + public String firstBean() { + return "FirstBean"; + } + + @Bean + @DependsOn("firstBean") + public String secondBean() { + return "SecondBeanAfterFirst"; + } +} diff --git a/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/orderbased/ConfigOne.java b/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/orderbased/ConfigOne.java new file mode 100644 index 000000000000..83b8cb746603 --- /dev/null +++ b/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/orderbased/ConfigOne.java @@ -0,0 +1,15 @@ +package com.baeldung.application.orderbased; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; + +@Configuration +@Order(1) +public class ConfigOne { + + @Bean + public String configOneBean() { + return "ConfigOneBean"; + } +} diff --git a/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/orderbased/ConfigTwo.java b/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/orderbased/ConfigTwo.java new file mode 100644 index 000000000000..4473f0f96f12 --- /dev/null +++ b/spring-boot-modules/spring-boot-config-order/src/main/java/com/baeldung/application/orderbased/ConfigTwo.java @@ -0,0 +1,15 @@ +package com.baeldung.application.orderbased; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; + +@Configuration +@Order(2) +public class ConfigTwo { + + @Bean + public String configTwoBean() { + return "ConfigTwoBean"; + } +} diff --git a/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/autoconfig/AutoConfigOrderTest.java b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/autoconfig/AutoConfigOrderTest.java new file mode 100644 index 000000000000..3974427f451d --- /dev/null +++ b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/autoconfig/AutoConfigOrderTest.java @@ -0,0 +1,26 @@ +package com.baeldung.autoconfig; + +import com.baeldung.application.autoconfig.FirstAutoConfig; +import com.baeldung.application.autoconfig.SecondAutoConfig; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest(classes = {SecondAutoConfig.class, FirstAutoConfig.class}) +class AutoConfigOrderTest { + + @Autowired + private ApplicationContext context; + + @Test + void givenAutoConfigs_whenLoaded_thenOrderFollowsAnnotations() { + String beanOne = context.getBean("autoBeanOne", String.class); + String beanTwo = context.getBean("autoBeanTwo", String.class); + + assertThat(beanOne).isEqualTo("AutoBeanOne"); + assertThat(beanTwo).isEqualTo("AutoBeanTwoAfterOne"); + } +} diff --git a/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/defaultconfig/DefaultConfigOrderTest.java b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/defaultconfig/DefaultConfigOrderTest.java new file mode 100644 index 000000000000..d816a763b646 --- /dev/null +++ b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/defaultconfig/DefaultConfigOrderTest.java @@ -0,0 +1,23 @@ +package com.baeldung.defaultconfig; + +import com.baeldung.application.defaultconfig.ConfigA; +import com.baeldung.application.defaultconfig.ConfigB; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ApplicationContext; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest(classes = {ConfigA.class, ConfigB.class}) +class DefaultConfigOrderTest { + + @Autowired + private ApplicationContext context; + + @Test + void givenConfigsWithoutOrder_whenLoaded_thenBeansExistRegardlessOfOrder() { + assertThat(context.getBean("beanA")).isEqualTo("Bean A"); + assertThat(context.getBean("beanB")).isEqualTo("Bean B"); + } +} diff --git a/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/dependsonconfig/DependsConfigTest.java b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/dependsonconfig/DependsConfigTest.java new file mode 100644 index 000000000000..cb0d5d124a1c --- /dev/null +++ b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/dependsonconfig/DependsConfigTest.java @@ -0,0 +1,26 @@ +package com.baeldung.dependsonconfig; + +import com.baeldung.application.dependsonconfig.DependsConfig; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest(classes = DependsConfig.class) +class DependsConfigTest { + + @Autowired + private ApplicationContext context; + + @Test + void givenDependsOnBeans_whenLoaded_thenOrderIsMaintained() { + String first = context.getBean("firstBean", String.class); + String second = context.getBean("secondBean", String.class); + + assertThat(first).isEqualTo("FirstBean"); + assertThat(second).isEqualTo("SecondBeanAfterFirst"); + } +} + diff --git a/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/orderbased/OrderedConfigTest.java b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/orderbased/OrderedConfigTest.java new file mode 100644 index 000000000000..9bb71be1bcd5 --- /dev/null +++ b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/orderbased/OrderedConfigTest.java @@ -0,0 +1,27 @@ +package com.baeldung.orderbased; + +import com.baeldung.application.orderbased.ConfigOne; +import com.baeldung.application.orderbased.ConfigTwo; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest(classes = {ConfigTwo.class, ConfigOne.class}) +class OrderedConfigTest { + + @Autowired + private ApplicationContext context; + + @Test + void givenOrderedConfigs_whenLoaded_thenOrderIsRespected() { + String beanOne = context.getBean("configOneBean", String.class); + String beanTwo = context.getBean("configTwoBean", String.class); + + assertThat(beanOne).isEqualTo("ConfigOneBean"); + assertThat(beanTwo).isEqualTo("ConfigTwoBean"); + } +} + From d2050324a975f1dc716896f3737f3cf237d9395e Mon Sep 17 00:00:00 2001 From: sverma1-godaddy Date: Thu, 16 Oct 2025 14:48:42 +0530 Subject: [PATCH 2/2] minor refactoring --- .../{AutoConfigOrderTest.java => AutoConfigOrderUnitTest.java} | 2 +- ...aultConfigOrderTest.java => DefaultConfigOrderUnitTest.java} | 2 +- .../{DependsConfigTest.java => DependsConfigUnitTest.java} | 2 +- .../{OrderedConfigTest.java => OrderedConfigUnitTest.java} | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/autoconfig/{AutoConfigOrderTest.java => AutoConfigOrderUnitTest.java} (96%) rename spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/defaultconfig/{DefaultConfigOrderTest.java => DefaultConfigOrderUnitTest.java} (95%) rename spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/dependsonconfig/{DependsConfigTest.java => DependsConfigUnitTest.java} (96%) rename spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/orderbased/{OrderedConfigTest.java => OrderedConfigUnitTest.java} (96%) diff --git a/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/autoconfig/AutoConfigOrderTest.java b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/autoconfig/AutoConfigOrderUnitTest.java similarity index 96% rename from spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/autoconfig/AutoConfigOrderTest.java rename to spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/autoconfig/AutoConfigOrderUnitTest.java index 3974427f451d..5eb079e1144f 100644 --- a/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/autoconfig/AutoConfigOrderTest.java +++ b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/autoconfig/AutoConfigOrderUnitTest.java @@ -10,7 +10,7 @@ import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(classes = {SecondAutoConfig.class, FirstAutoConfig.class}) -class AutoConfigOrderTest { +class AutoConfigOrderUnitTest { @Autowired private ApplicationContext context; diff --git a/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/defaultconfig/DefaultConfigOrderTest.java b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/defaultconfig/DefaultConfigOrderUnitTest.java similarity index 95% rename from spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/defaultconfig/DefaultConfigOrderTest.java rename to spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/defaultconfig/DefaultConfigOrderUnitTest.java index d816a763b646..7220da7fbc97 100644 --- a/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/defaultconfig/DefaultConfigOrderTest.java +++ b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/defaultconfig/DefaultConfigOrderUnitTest.java @@ -10,7 +10,7 @@ import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(classes = {ConfigA.class, ConfigB.class}) -class DefaultConfigOrderTest { +class DefaultConfigOrderUnitTest { @Autowired private ApplicationContext context; diff --git a/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/dependsonconfig/DependsConfigTest.java b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/dependsonconfig/DependsConfigUnitTest.java similarity index 96% rename from spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/dependsonconfig/DependsConfigTest.java rename to spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/dependsonconfig/DependsConfigUnitTest.java index cb0d5d124a1c..505532d60f64 100644 --- a/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/dependsonconfig/DependsConfigTest.java +++ b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/dependsonconfig/DependsConfigUnitTest.java @@ -9,7 +9,7 @@ import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(classes = DependsConfig.class) -class DependsConfigTest { +class DependsConfigUnitTest { @Autowired private ApplicationContext context; diff --git a/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/orderbased/OrderedConfigTest.java b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/orderbased/OrderedConfigUnitTest.java similarity index 96% rename from spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/orderbased/OrderedConfigTest.java rename to spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/orderbased/OrderedConfigUnitTest.java index 9bb71be1bcd5..f23325e1b8b0 100644 --- a/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/orderbased/OrderedConfigTest.java +++ b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/orderbased/OrderedConfigUnitTest.java @@ -10,7 +10,7 @@ import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(classes = {ConfigTwo.class, ConfigOne.class}) -class OrderedConfigTest { +class OrderedConfigUnitTest { @Autowired private ApplicationContext context;