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/AutoConfigOrderUnitTest.java b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/autoconfig/AutoConfigOrderUnitTest.java
new file mode 100644
index 000000000000..5eb079e1144f
--- /dev/null
+++ b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/autoconfig/AutoConfigOrderUnitTest.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 AutoConfigOrderUnitTest {
+
+ @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/DefaultConfigOrderUnitTest.java b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/defaultconfig/DefaultConfigOrderUnitTest.java
new file mode 100644
index 000000000000..7220da7fbc97
--- /dev/null
+++ b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/defaultconfig/DefaultConfigOrderUnitTest.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 DefaultConfigOrderUnitTest {
+
+ @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/DependsConfigUnitTest.java b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/dependsonconfig/DependsConfigUnitTest.java
new file mode 100644
index 000000000000..505532d60f64
--- /dev/null
+++ b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/dependsonconfig/DependsConfigUnitTest.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 DependsConfigUnitTest {
+
+ @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/OrderedConfigUnitTest.java b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/orderbased/OrderedConfigUnitTest.java
new file mode 100644
index 000000000000..f23325e1b8b0
--- /dev/null
+++ b/spring-boot-modules/spring-boot-config-order/src/test/java/com/baeldung/orderbased/OrderedConfigUnitTest.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 OrderedConfigUnitTest {
+
+ @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");
+ }
+}
+