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"); + } +} +