From 07b49e32c2ef1a65328482e1a251d1349485e219 Mon Sep 17 00:00:00 2001 From: Ariel Papuga Date: Fri, 21 Jun 2019 22:01:00 +0200 Subject: [PATCH 1/3] BAEL-2921 Understanding getBean --- .../baeldung/getbean/AnnotationConfig.java | 22 ++++++++++ .../main/java/com/baeldung/getbean/Lion.java | 13 ++++++ .../main/java/com/baeldung/getbean/Tiger.java | 13 ++++++ .../getbean/GetBeanByNameAndTypeUnitTest.java | 33 +++++++++++++++ .../getbean/GetBeanByNameUnitTest.java | 40 +++++++++++++++++++ ...NameWithConstructorParametersUnitTest.java | 38 ++++++++++++++++++ .../getbean/GetBeanByTypeUnitTest.java | 33 +++++++++++++++ ...TypeWithConstructorParametersUnitTest.java | 26 ++++++++++++ 8 files changed, 218 insertions(+) create mode 100644 spring-core/src/main/java/com/baeldung/getbean/AnnotationConfig.java create mode 100644 spring-core/src/main/java/com/baeldung/getbean/Lion.java create mode 100644 spring-core/src/main/java/com/baeldung/getbean/Tiger.java create mode 100644 spring-core/src/test/java/com/baeldung/getbean/GetBeanByNameAndTypeUnitTest.java create mode 100644 spring-core/src/test/java/com/baeldung/getbean/GetBeanByNameUnitTest.java create mode 100644 spring-core/src/test/java/com/baeldung/getbean/GetBeanByNameWithConstructorParametersUnitTest.java create mode 100644 spring-core/src/test/java/com/baeldung/getbean/GetBeanByTypeUnitTest.java create mode 100644 spring-core/src/test/java/com/baeldung/getbean/GetBeanByTypeWithConstructorParametersUnitTest.java diff --git a/spring-core/src/main/java/com/baeldung/getbean/AnnotationConfig.java b/spring-core/src/main/java/com/baeldung/getbean/AnnotationConfig.java new file mode 100644 index 0000000000..12e3ab55e3 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/getbean/AnnotationConfig.java @@ -0,0 +1,22 @@ +package com.baeldung.getbean; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +class AnnotationConfig { + + @Bean(name = {"tiger", "kitty"}) + @Scope(value = "prototype") + Tiger getTiger(String name) { + return new Tiger(name); + } + + @Bean(name = "lion") + Lion getLion() { + return new Lion("Hardcoded lion name"); + } + + interface Animal {} +} diff --git a/spring-core/src/main/java/com/baeldung/getbean/Lion.java b/spring-core/src/main/java/com/baeldung/getbean/Lion.java new file mode 100644 index 0000000000..96c569aeb9 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/getbean/Lion.java @@ -0,0 +1,13 @@ +package com.baeldung.getbean; + +class Lion implements AnnotationConfig.Animal { + private String name; + + Lion(String name) { + this.name = name; + } + + String getName() { + return name; + } +} diff --git a/spring-core/src/main/java/com/baeldung/getbean/Tiger.java b/spring-core/src/main/java/com/baeldung/getbean/Tiger.java new file mode 100644 index 0000000000..85b9626c79 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/getbean/Tiger.java @@ -0,0 +1,13 @@ +package com.baeldung.getbean; + +class Tiger implements AnnotationConfig.Animal { + private String name; + + Tiger(String name) { + this.name = name; + } + + String getName() { + return name; + } +} diff --git a/spring-core/src/test/java/com/baeldung/getbean/GetBeanByNameAndTypeUnitTest.java b/spring-core/src/test/java/com/baeldung/getbean/GetBeanByNameAndTypeUnitTest.java new file mode 100644 index 0000000000..e06804c28e --- /dev/null +++ b/spring-core/src/test/java/com/baeldung/getbean/GetBeanByNameAndTypeUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.getbean; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.springframework.beans.factory.BeanNotOfRequiredTypeException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +class GetBeanByNameAndTypeUnitTest { + private ApplicationContext context; + + @BeforeAll + void setup() { + context = new AnnotationConfigApplicationContext(AnnotationConfig.class); + } + + @Test + void whenSpecifiedMatchingNameAndType_thenShouldReturnRelatedBean() { + Lion lion = context.getBean("lion", Lion.class); + + assertEquals("Hardcoded lion name", lion.getName()); + } + + @Test + void whenSpecifiedNotMatchingNameAndType_thenShouldThrowException() { + assertThrows(BeanNotOfRequiredTypeException.class, () -> context.getBean("lion", Tiger.class)); + } +} diff --git a/spring-core/src/test/java/com/baeldung/getbean/GetBeanByNameUnitTest.java b/spring-core/src/test/java/com/baeldung/getbean/GetBeanByNameUnitTest.java new file mode 100644 index 0000000000..70a135b314 --- /dev/null +++ b/spring-core/src/test/java/com/baeldung/getbean/GetBeanByNameUnitTest.java @@ -0,0 +1,40 @@ +package com.baeldung.getbean; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +class GetBeanByNameUnitTest { + private ApplicationContext context; + + @BeforeAll + void setup() { + context = new AnnotationConfigApplicationContext(AnnotationConfig.class); + } + + @Test + void whenGivenExistingBeanName_shouldReturnThatBean() { + Object requestedBean = context.getBean("lion"); + + assertEquals(requestedBean.getClass(), Lion.class); + } + + @Test + void whenGivenNonExistingBeanName_shouldThrowException() { + assertThrows(NoSuchBeanDefinitionException.class, () -> context.getBean("non-existing")); + } + + @Test + void whenCastingToWrongType_thenShouldThrowException() { + assertThrows(ClassCastException.class, () -> { + Tiger tiger = (Tiger) context.getBean("lion"); + }); + } +} diff --git a/spring-core/src/test/java/com/baeldung/getbean/GetBeanByNameWithConstructorParametersUnitTest.java b/spring-core/src/test/java/com/baeldung/getbean/GetBeanByNameWithConstructorParametersUnitTest.java new file mode 100644 index 0000000000..4ac8c1ac13 --- /dev/null +++ b/spring-core/src/test/java/com/baeldung/getbean/GetBeanByNameWithConstructorParametersUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.getbean; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.springframework.beans.factory.UnsatisfiedDependencyException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +class GetBeanByNameWithConstructorParametersUnitTest { + private ApplicationContext context; + + @BeforeAll + void setup() { + context = new AnnotationConfigApplicationContext(AnnotationConfig.class); + } + + @Test + void whenGivenCorrectNameOrAlias_shouldReturnBeanWithSpecifiedName() { + Tiger tiger = (Tiger) context.getBean("tiger", "Cutie"); + Tiger tigerSecond = (Tiger) context.getBean("tiger", "Striped"); + Tiger tigerViaAlias = (Tiger) context.getBean("kitty", "Siberian"); + assertEquals("Cutie", tiger.getName()); + assertEquals("Striped", tigerSecond.getName()); + assertEquals("Siberian", tigerViaAlias.getName()); + } + + @Test + void whenNoArgumentSpecifiedForPrototypeBean_thenShouldThrowException() { + assertThrows(UnsatisfiedDependencyException.class, () -> { + Tiger tiger = (Tiger) context.getBean("tiger"); + }); + } +} diff --git a/spring-core/src/test/java/com/baeldung/getbean/GetBeanByTypeUnitTest.java b/spring-core/src/test/java/com/baeldung/getbean/GetBeanByTypeUnitTest.java new file mode 100644 index 0000000000..a4d4ab732b --- /dev/null +++ b/spring-core/src/test/java/com/baeldung/getbean/GetBeanByTypeUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.getbean; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.springframework.beans.factory.NoUniqueBeanDefinitionException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +class GetBeanByTypeUnitTest { + private ApplicationContext context; + + @BeforeAll + void setup() { + context = new AnnotationConfigApplicationContext(AnnotationConfig.class); + } + + @Test + void whenGivenExistingUniqueType_thenShouldReturnRelatedBean() { + Lion lion = context.getBean(Lion.class); + + assertNotNull(lion); + } + + @Test + void whenGivenAmbiguousType_thenShouldThrowException() { + assertThrows(NoUniqueBeanDefinitionException.class, () -> context.getBean(AnnotationConfig.Animal.class)); + } +} diff --git a/spring-core/src/test/java/com/baeldung/getbean/GetBeanByTypeWithConstructorParametersUnitTest.java b/spring-core/src/test/java/com/baeldung/getbean/GetBeanByTypeWithConstructorParametersUnitTest.java new file mode 100644 index 0000000000..08bcb92145 --- /dev/null +++ b/spring-core/src/test/java/com/baeldung/getbean/GetBeanByTypeWithConstructorParametersUnitTest.java @@ -0,0 +1,26 @@ +package com.baeldung.getbean; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +class GetBeanByTypeWithConstructorParametersUnitTest { + private ApplicationContext context; + + @BeforeAll + void setup() { + context = new AnnotationConfigApplicationContext(AnnotationConfig.class); + } + + @Test + void whenGivenExistingTypeAndValidParameters_thenShouldReturnRelatedBean() { + Tiger tiger = context.getBean(Tiger.class, "Shere Khan"); + + assertEquals("Shere Khan", tiger.getName()); + } +} From 72c39bab4c63f01da9703b079d0f099f67ef0d17 Mon Sep 17 00:00:00 2001 From: Ariel Papuga Date: Mon, 24 Jun 2019 23:09:44 +0200 Subject: [PATCH 2/3] BAEL-2921 Review: creation of spring-core-2 module --- pom.xml | 1 + spring-core-2/pom.xml | 60 +++++++++++++++++++ .../baeldung/getbean/AnnotationConfig.java | 0 .../main/java/com/baeldung/getbean/Lion.java | 0 .../main/java/com/baeldung/getbean/Tiger.java | 0 .../getbean/GetBeanByNameAndTypeUnitTest.java | 0 .../getbean/GetBeanByNameUnitTest.java | 4 +- ...NameWithConstructorParametersUnitTest.java | 18 ++++-- .../getbean/GetBeanByTypeUnitTest.java | 0 ...TypeWithConstructorParametersUnitTest.java | 0 10 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 spring-core-2/pom.xml rename {spring-core => spring-core-2}/src/main/java/com/baeldung/getbean/AnnotationConfig.java (100%) rename {spring-core => spring-core-2}/src/main/java/com/baeldung/getbean/Lion.java (100%) rename {spring-core => spring-core-2}/src/main/java/com/baeldung/getbean/Tiger.java (100%) rename {spring-core => spring-core-2}/src/test/java/com/baeldung/getbean/GetBeanByNameAndTypeUnitTest.java (100%) rename {spring-core => spring-core-2}/src/test/java/com/baeldung/getbean/GetBeanByNameUnitTest.java (91%) rename {spring-core => spring-core-2}/src/test/java/com/baeldung/getbean/GetBeanByNameWithConstructorParametersUnitTest.java (70%) rename {spring-core => spring-core-2}/src/test/java/com/baeldung/getbean/GetBeanByTypeUnitTest.java (100%) rename {spring-core => spring-core-2}/src/test/java/com/baeldung/getbean/GetBeanByTypeWithConstructorParametersUnitTest.java (100%) diff --git a/pom.xml b/pom.xml index 9760e06bc1..aae8f500bb 100644 --- a/pom.xml +++ b/pom.xml @@ -659,6 +659,7 @@ spring-cloud-data-flow spring-core + spring-core-2 spring-cucumber spring-data-rest diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml new file mode 100644 index 0000000000..8e4c539e3b --- /dev/null +++ b/spring-core-2/pom.xml @@ -0,0 +1,60 @@ + + + + com.baeldung + parent-spring-5 + 0.0.1-SNAPSHOT + ../parent-spring-5 + + 4.0.0 + + spring-core-2 + + + + org.springframework + spring-beans + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-core + ${spring.version} + + + org.junit.jupiter + junit-jupiter-engine + ${junit.jupiter.version} + test + + + org.junit.jupiter + junit-jupiter-api + ${junit.jupiter.version} + test + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.1 + + + + + + 5.1.4.RELEASE + 5.0.2 + + + \ No newline at end of file diff --git a/spring-core/src/main/java/com/baeldung/getbean/AnnotationConfig.java b/spring-core-2/src/main/java/com/baeldung/getbean/AnnotationConfig.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/getbean/AnnotationConfig.java rename to spring-core-2/src/main/java/com/baeldung/getbean/AnnotationConfig.java diff --git a/spring-core/src/main/java/com/baeldung/getbean/Lion.java b/spring-core-2/src/main/java/com/baeldung/getbean/Lion.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/getbean/Lion.java rename to spring-core-2/src/main/java/com/baeldung/getbean/Lion.java diff --git a/spring-core/src/main/java/com/baeldung/getbean/Tiger.java b/spring-core-2/src/main/java/com/baeldung/getbean/Tiger.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/getbean/Tiger.java rename to spring-core-2/src/main/java/com/baeldung/getbean/Tiger.java diff --git a/spring-core/src/test/java/com/baeldung/getbean/GetBeanByNameAndTypeUnitTest.java b/spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByNameAndTypeUnitTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/getbean/GetBeanByNameAndTypeUnitTest.java rename to spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByNameAndTypeUnitTest.java diff --git a/spring-core/src/test/java/com/baeldung/getbean/GetBeanByNameUnitTest.java b/spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByNameUnitTest.java similarity index 91% rename from spring-core/src/test/java/com/baeldung/getbean/GetBeanByNameUnitTest.java rename to spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByNameUnitTest.java index 70a135b314..4d6d77e39d 100644 --- a/spring-core/src/test/java/com/baeldung/getbean/GetBeanByNameUnitTest.java +++ b/spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByNameUnitTest.java @@ -21,9 +21,9 @@ class GetBeanByNameUnitTest { @Test void whenGivenExistingBeanName_shouldReturnThatBean() { - Object requestedBean = context.getBean("lion"); + Object lion = context.getBean("lion"); - assertEquals(requestedBean.getClass(), Lion.class); + assertEquals(lion.getClass(), Lion.class); } @Test diff --git a/spring-core/src/test/java/com/baeldung/getbean/GetBeanByNameWithConstructorParametersUnitTest.java b/spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByNameWithConstructorParametersUnitTest.java similarity index 70% rename from spring-core/src/test/java/com/baeldung/getbean/GetBeanByNameWithConstructorParametersUnitTest.java rename to spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByNameWithConstructorParametersUnitTest.java index 4ac8c1ac13..32d37e4ff2 100644 --- a/spring-core/src/test/java/com/baeldung/getbean/GetBeanByNameWithConstructorParametersUnitTest.java +++ b/spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByNameWithConstructorParametersUnitTest.java @@ -19,14 +19,20 @@ class GetBeanByNameWithConstructorParametersUnitTest { context = new AnnotationConfigApplicationContext(AnnotationConfig.class); } + @Test + void whenGivenCorrectName_thenShouldReturnBeanWithSpecifiedName() { + Tiger tiger = (Tiger) context.getBean("tiger", "Siberian"); + + assertEquals("Siberian", tiger.getName()); + } + @Test void whenGivenCorrectNameOrAlias_shouldReturnBeanWithSpecifiedName() { - Tiger tiger = (Tiger) context.getBean("tiger", "Cutie"); - Tiger tigerSecond = (Tiger) context.getBean("tiger", "Striped"); - Tiger tigerViaAlias = (Tiger) context.getBean("kitty", "Siberian"); - assertEquals("Cutie", tiger.getName()); - assertEquals("Striped", tigerSecond.getName()); - assertEquals("Siberian", tigerViaAlias.getName()); + Tiger tiger = (Tiger) context.getBean("tiger", "Siberian"); + Tiger secondTiger = (Tiger) context.getBean("tiger", "Striped"); + + assertEquals("Siberian", tiger.getName()); + assertEquals("Striped", secondTiger.getName()); } @Test diff --git a/spring-core/src/test/java/com/baeldung/getbean/GetBeanByTypeUnitTest.java b/spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByTypeUnitTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/getbean/GetBeanByTypeUnitTest.java rename to spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByTypeUnitTest.java diff --git a/spring-core/src/test/java/com/baeldung/getbean/GetBeanByTypeWithConstructorParametersUnitTest.java b/spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByTypeWithConstructorParametersUnitTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/getbean/GetBeanByTypeWithConstructorParametersUnitTest.java rename to spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByTypeWithConstructorParametersUnitTest.java From 1c5e02d4d1a4ece73519533d55179e07330e9a50 Mon Sep 17 00:00:00 2001 From: Eric Martin Date: Fri, 28 Jun 2019 19:48:04 -0500 Subject: [PATCH 3/3] Update pom.xml Tabs/spaces. Added to integration profile. --- pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index aae8f500bb..d535ca87a5 100644 --- a/pom.xml +++ b/pom.xml @@ -659,7 +659,7 @@ spring-cloud-data-flow spring-core - spring-core-2 + spring-core-2 spring-cucumber spring-data-rest @@ -1324,6 +1324,7 @@ spring-cloud-data-flow spring-core + spring-core-2 spring-cucumber spring-data-rest