diff --git a/pom.xml b/pom.xml index b7c4efa421..e540cd32eb 100644 --- a/pom.xml +++ b/pom.xml @@ -652,6 +652,7 @@ spring-data-rest-querydsl spring-di spring-di-2 + spring-di-3 spring-drools spring-ejb diff --git a/spring-di-2/README.md b/spring-di-2/README.md index f41976c3f0..5989e6269b 100644 --- a/spring-di-2/README.md +++ b/spring-di-2/README.md @@ -9,4 +9,6 @@ This module contains articles about dependency injection with Spring - [Spring – Injecting Collections](https://www.baeldung.com/spring-injecting-collections) - [Wiring in Spring: @Autowired, @Resource and @Inject](https://www.baeldung.com/spring-annotations-resource-inject-autowire) - [Injecting Spring Beans into Unmanaged Objects](https://www.baeldung.com/spring-inject-bean-into-unmanaged-objects) -- More articles: [[<-- prev]](/spring-di) +- [Constructor Dependency Injection in Spring](https://www.baeldung.com/constructor-injection-in-spring) +- [Circular Dependencies in Spring](https://www.baeldung.com/circular-dependencies-in-spring) +- More articles: [[<-- prev]](../spring-di)[[more -->]](../spring-di-3) diff --git a/spring-di-2/pom.xml b/spring-di-2/pom.xml index 7d3f4c7b33..0e57c6ef92 100644 --- a/spring-di-2/pom.xml +++ b/spring-di-2/pom.xml @@ -14,37 +14,41 @@ ../parent-spring-5 + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + - org.springframework - spring-test - ${spring.version} + org.springframework.boot + spring-boot-starter-web org.springframework.boot spring-boot-starter-data-jpa - ${spring-boot.version} - - - org.springframework.boot - spring-boot-starter-web - ${spring-boot.version} org.springframework spring-aspects - ${spring.version} - - - org.projectlombok - lombok - ${lombok.version} javax.inject javax.inject ${javax.inject.version} + + + org.springframework.boot + spring-boot-starter-test + @@ -74,7 +78,7 @@ - 2.3.1.RELEASE + 2.6.1 1.11 1 diff --git a/spring-di/src/main/java/com/baeldung/circulardependency/CircularDependencyA.java b/spring-di-2/src/main/java/com/baeldung/circulardependency/CircularDependencyA.java similarity index 100% rename from spring-di/src/main/java/com/baeldung/circulardependency/CircularDependencyA.java rename to spring-di-2/src/main/java/com/baeldung/circulardependency/CircularDependencyA.java diff --git a/spring-di/src/main/java/com/baeldung/circulardependency/CircularDependencyB.java b/spring-di-2/src/main/java/com/baeldung/circulardependency/CircularDependencyB.java similarity index 100% rename from spring-di/src/main/java/com/baeldung/circulardependency/CircularDependencyB.java rename to spring-di-2/src/main/java/com/baeldung/circulardependency/CircularDependencyB.java diff --git a/spring-di/src/main/java/com/baeldung/constructordi/Config.java b/spring-di-2/src/main/java/com/baeldung/constructordi/Config.java similarity index 99% rename from spring-di/src/main/java/com/baeldung/constructordi/Config.java rename to spring-di-2/src/main/java/com/baeldung/constructordi/Config.java index 07568018f3..d3c6b2d231 100644 --- a/spring-di/src/main/java/com/baeldung/constructordi/Config.java +++ b/spring-di-2/src/main/java/com/baeldung/constructordi/Config.java @@ -1,11 +1,10 @@ package com.baeldung.constructordi; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; - import com.baeldung.constructordi.domain.Engine; import com.baeldung.constructordi.domain.Transmission; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan("com.baeldung.constructordi") diff --git a/spring-di/src/main/java/com/baeldung/constructordi/SpringRunner.java b/spring-di-2/src/main/java/com/baeldung/constructordi/SpringRunner.java similarity index 99% rename from spring-di/src/main/java/com/baeldung/constructordi/SpringRunner.java rename to spring-di-2/src/main/java/com/baeldung/constructordi/SpringRunner.java index abbe97a4bd..75a1af47ee 100644 --- a/spring-di/src/main/java/com/baeldung/constructordi/SpringRunner.java +++ b/spring-di-2/src/main/java/com/baeldung/constructordi/SpringRunner.java @@ -1,11 +1,10 @@ package com.baeldung.constructordi; +import com.baeldung.constructordi.domain.Car; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; -import com.baeldung.constructordi.domain.Car; - public class SpringRunner { public static void main(String[] args) { Car toyota = getCarFromXml(); diff --git a/spring-di/src/main/java/com/baeldung/constructordi/domain/Car.java b/spring-di-2/src/main/java/com/baeldung/constructordi/domain/Car.java similarity index 85% rename from spring-di/src/main/java/com/baeldung/constructordi/domain/Car.java rename to spring-di-2/src/main/java/com/baeldung/constructordi/domain/Car.java index 9f68ba5cd9..bbe9b669d8 100644 --- a/spring-di/src/main/java/com/baeldung/constructordi/domain/Car.java +++ b/spring-di-2/src/main/java/com/baeldung/constructordi/domain/Car.java @@ -5,8 +5,9 @@ import org.springframework.stereotype.Component; @Component public class Car { - private Engine engine; - private Transmission transmission; + + private final Engine engine; + private final Transmission transmission; @Autowired public Car(Engine engine, Transmission transmission) { diff --git a/spring-di/src/main/java/com/baeldung/constructordi/domain/Engine.java b/spring-di-2/src/main/java/com/baeldung/constructordi/domain/Engine.java similarity index 81% rename from spring-di/src/main/java/com/baeldung/constructordi/domain/Engine.java rename to spring-di-2/src/main/java/com/baeldung/constructordi/domain/Engine.java index f2987988eb..ed9c1f4d1c 100644 --- a/spring-di/src/main/java/com/baeldung/constructordi/domain/Engine.java +++ b/spring-di-2/src/main/java/com/baeldung/constructordi/domain/Engine.java @@ -1,8 +1,9 @@ package com.baeldung.constructordi.domain; public class Engine { - private String type; - private int volume; + + private final String type; + private final int volume; public Engine(String type, int volume) { this.type = type; diff --git a/spring-di/src/main/java/com/baeldung/constructordi/domain/Transmission.java b/spring-di-2/src/main/java/com/baeldung/constructordi/domain/Transmission.java similarity index 88% rename from spring-di/src/main/java/com/baeldung/constructordi/domain/Transmission.java rename to spring-di-2/src/main/java/com/baeldung/constructordi/domain/Transmission.java index 85271e1f2a..00060e4921 100644 --- a/spring-di/src/main/java/com/baeldung/constructordi/domain/Transmission.java +++ b/spring-di-2/src/main/java/com/baeldung/constructordi/domain/Transmission.java @@ -1,7 +1,8 @@ package com.baeldung.constructordi.domain; public class Transmission { - private String type; + + private final String type; public Transmission(String type) { this.type = type; diff --git a/spring-di/src/main/resources/constructordi.xml b/spring-di-2/src/main/resources/constructordi.xml similarity index 100% rename from spring-di/src/main/resources/constructordi.xml rename to spring-di-2/src/main/resources/constructordi.xml diff --git a/spring-di/src/test/java/com/baeldung/circulardependency/CircularDependencyIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/circulardependency/CircularDependencyIntegrationTest.java similarity index 100% rename from spring-di/src/test/java/com/baeldung/circulardependency/CircularDependencyIntegrationTest.java rename to spring-di-2/src/test/java/com/baeldung/circulardependency/CircularDependencyIntegrationTest.java diff --git a/spring-di/src/test/java/com/baeldung/circulardependency/TestConfig.java b/spring-di-2/src/test/java/com/baeldung/circulardependency/TestConfig.java similarity index 100% rename from spring-di/src/test/java/com/baeldung/circulardependency/TestConfig.java rename to spring-di-2/src/test/java/com/baeldung/circulardependency/TestConfig.java diff --git a/spring-di/src/test/java/com/baeldung/constructordi/ConstructorDependencyInjectionIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/constructordi/ConstructorDependencyInjectionIntegrationTest.java similarity index 99% rename from spring-di/src/test/java/com/baeldung/constructordi/ConstructorDependencyInjectionIntegrationTest.java rename to spring-di-2/src/test/java/com/baeldung/constructordi/ConstructorDependencyInjectionIntegrationTest.java index 7bd0ad0c86..4c4e622629 100644 --- a/spring-di/src/test/java/com/baeldung/constructordi/ConstructorDependencyInjectionIntegrationTest.java +++ b/spring-di-2/src/test/java/com/baeldung/constructordi/ConstructorDependencyInjectionIntegrationTest.java @@ -1,7 +1,6 @@ package com.baeldung.constructordi; -import static org.assertj.core.api.Assertions.assertThat; - +import com.baeldung.constructordi.domain.Car; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.context.ApplicationContext; @@ -11,7 +10,7 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; -import com.baeldung.constructordi.domain.Car; +import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = Config.class) diff --git a/spring-di-2/src/test/java/com/baeldung/di/aspectj/PersonUnitTest.java b/spring-di-2/src/test/java/com/baeldung/di/aspectj/PersonUnitTest.java index 72ccfbadf3..d0318e96b9 100644 --- a/spring-di-2/src/test/java/com/baeldung/di/aspectj/PersonUnitTest.java +++ b/spring-di-2/src/test/java/com/baeldung/di/aspectj/PersonUnitTest.java @@ -10,10 +10,12 @@ import static org.junit.Assert.assertEquals; @RunWith(SpringRunner.class) @ContextConfiguration(classes = AspectJConfig.class) public class PersonUnitTest { + @Test public void givenUnmanagedObjects_whenInjectingIdService_thenIdValueIsCorrectlySet() { PersonObject personObject = new PersonObject("Baeldung"); personObject.generateId(); + assertEquals(1, personObject.getId()); assertEquals("Baeldung", personObject.getName()); diff --git a/spring-di-3/README.md b/spring-di-3/README.md new file mode 100644 index 0000000000..9ab7789f37 --- /dev/null +++ b/spring-di-3/README.md @@ -0,0 +1,8 @@ +## Spring Dependency Injection + +This module contains articles about dependency injection with Spring + +### Relevant Articles + +- [@Lookup Annotation in Spring](https://www.baeldung.com/spring-lookup) +- More articles: [[<-- prev]](../spring-di-2) diff --git a/spring-di-3/pom.xml b/spring-di-3/pom.xml new file mode 100644 index 0000000000..0d4bbd01af --- /dev/null +++ b/spring-di-3/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + spring-di-3 + 1.0-SNAPSHOT + spring-di-3 + + + com.baeldung + parent-spring-5 + 0.0.1-SNAPSHOT + ../parent-spring-5 + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + + + + + 2.6.1 + + + \ No newline at end of file diff --git a/spring-di/src/main/java/com/baeldung/methodinjections/AppConfig.java b/spring-di-3/src/main/java/com/baeldung/methodinjections/AppConfig.java similarity index 99% rename from spring-di/src/main/java/com/baeldung/methodinjections/AppConfig.java rename to spring-di-3/src/main/java/com/baeldung/methodinjections/AppConfig.java index 7c1e209383..59c0e1543a 100644 --- a/spring-di/src/main/java/com/baeldung/methodinjections/AppConfig.java +++ b/spring-di-3/src/main/java/com/baeldung/methodinjections/AppConfig.java @@ -5,6 +5,5 @@ import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan(basePackages = "com.baeldung.methodinjections") - public class AppConfig { } diff --git a/spring-di/src/main/java/com/baeldung/methodinjections/Grader.java b/spring-di-3/src/main/java/com/baeldung/methodinjections/Grader.java similarity index 100% rename from spring-di/src/main/java/com/baeldung/methodinjections/Grader.java rename to spring-di-3/src/main/java/com/baeldung/methodinjections/Grader.java index 10dc77484c..f1b2bc7ea4 100644 --- a/spring-di/src/main/java/com/baeldung/methodinjections/Grader.java +++ b/spring-di-3/src/main/java/com/baeldung/methodinjections/Grader.java @@ -1,9 +1,9 @@ package com.baeldung.methodinjections; -import java.util.Collection; - import org.springframework.stereotype.Component; +import java.util.Collection; + @Component public class Grader { diff --git a/spring-di/src/main/java/com/baeldung/methodinjections/SchoolNotification.java b/spring-di-3/src/main/java/com/baeldung/methodinjections/SchoolNotification.java similarity index 95% rename from spring-di/src/main/java/com/baeldung/methodinjections/SchoolNotification.java rename to spring-di-3/src/main/java/com/baeldung/methodinjections/SchoolNotification.java index 752eb8893f..d9396f09b8 100644 --- a/spring-di/src/main/java/com/baeldung/methodinjections/SchoolNotification.java +++ b/spring-di-3/src/main/java/com/baeldung/methodinjections/SchoolNotification.java @@ -1,13 +1,13 @@ package com.baeldung.methodinjections; -import java.util.ArrayList; -import java.util.Collection; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +import java.util.ArrayList; +import java.util.Collection; + @Component("schoolNotification") @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class SchoolNotification { @@ -19,7 +19,7 @@ public class SchoolNotification { public SchoolNotification(String name) { this.name = name; - this.marks = new ArrayList(); + this.marks = new ArrayList<>(); } public String addMark(Integer mark) { diff --git a/spring-di/src/main/java/com/baeldung/methodinjections/Student.java b/spring-di-3/src/main/java/com/baeldung/methodinjections/Student.java similarity index 100% rename from spring-di/src/main/java/com/baeldung/methodinjections/Student.java rename to spring-di-3/src/main/java/com/baeldung/methodinjections/Student.java diff --git a/spring-di/src/main/java/com/baeldung/methodinjections/StudentServices.java b/spring-di-3/src/main/java/com/baeldung/methodinjections/StudentServices.java similarity index 88% rename from spring-di/src/main/java/com/baeldung/methodinjections/StudentServices.java rename to spring-di-3/src/main/java/com/baeldung/methodinjections/StudentServices.java index 20d631b120..1bb9bda542 100644 --- a/spring-di/src/main/java/com/baeldung/methodinjections/StudentServices.java +++ b/spring-di-3/src/main/java/com/baeldung/methodinjections/StudentServices.java @@ -1,15 +1,15 @@ package com.baeldung.methodinjections; -import java.util.HashMap; -import java.util.Map; - import org.springframework.beans.factory.annotation.Lookup; import org.springframework.stereotype.Component; +import java.util.HashMap; +import java.util.Map; + @Component("studentService") public abstract class StudentServices { - private Map notes = new HashMap<>(); + private final Map notes = new HashMap<>(); @Lookup protected abstract SchoolNotification getNotification(String name); diff --git a/spring-di-3/src/main/resources/application.properties b/spring-di-3/src/main/resources/application.properties new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/spring-di-3/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/spring-di/src/main/resources/beans.xml b/spring-di-3/src/main/resources/beans.xml similarity index 100% rename from spring-di/src/main/resources/beans.xml rename to spring-di-3/src/main/resources/beans.xml diff --git a/spring-di-3/src/test/java/com/baeldung/methodinjections/StudentIntegrationTest.java b/spring-di-3/src/test/java/com/baeldung/methodinjections/StudentIntegrationTest.java new file mode 100644 index 0000000000..190a7d8773 --- /dev/null +++ b/spring-di-3/src/test/java/com/baeldung/methodinjections/StudentIntegrationTest.java @@ -0,0 +1,42 @@ +package com.baeldung.methodinjections; + +import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; + +public class StudentIntegrationTest { + + private ConfigurableApplicationContext context; + + @AfterEach + public void tearDown() { + context.close(); + } + + @Test + public void whenLookupMethodCalled_thenNewInstanceReturned() { + context = new AnnotationConfigApplicationContext(AppConfig.class); + + Student student1 = context.getBean("studentBean", Student.class); + Student student2 = context.getBean("studentBean", Student.class); + + assertEquals(student1, student2); + assertNotEquals(student1.getNotification("Alex"), student2.getNotification("Bethany")); + } + + @Test + public void whenAbstractGetterMethodInjects_thenNewInstanceReturned() { + context = new ClassPathXmlApplicationContext("beans.xml"); + + StudentServices services = context.getBean("studentServices", StudentServices.class); + + assertEquals("PASS", services.appendMark("Alex", 76)); + assertEquals("FAIL", services.appendMark("Bethany", 44)); + assertEquals("PASS", services.appendMark("Claire", 96)); + } +} diff --git a/spring-di-3/src/test/resources/logback-test.xml b/spring-di-3/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..8d4771e308 --- /dev/null +++ b/spring-di-3/src/test/resources/logback-test.xml @@ -0,0 +1,12 @@ + + + + + [%d{ISO8601}]-[%thread] %-5level %logger - %msg%n + + + + + + + \ No newline at end of file diff --git a/spring-di/README.md b/spring-di/README.md index d470768f16..7b1ebd41b9 100644 --- a/spring-di/README.md +++ b/spring-di/README.md @@ -5,13 +5,10 @@ This module contains articles about dependency injection with Spring ### Relevant Articles - [The Spring @Qualifier Annotation](https://www.baeldung.com/spring-qualifier-annotation) -- [Constructor Dependency Injection in Spring](https://www.baeldung.com/constructor-injection-in-spring) - [Spring Autowiring of Generic Types](https://www.baeldung.com/spring-autowire-generics) - [Guice vs Spring – Dependency Injection](https://www.baeldung.com/guice-spring-dependency-injection) - [Injecting Prototype Beans into a Singleton Instance in Spring](https://www.baeldung.com/spring-inject-prototype-bean-into-singleton) -- [@Lookup Annotation in Spring](https://www.baeldung.com/spring-lookup) - [Controlling Bean Creation Order with @DependsOn Annotation](https://www.baeldung.com/spring-depends-on) - [Unsatisfied Dependency in Spring](https://www.baeldung.com/spring-unsatisfied-dependency) -- [Circular Dependencies in Spring](https://www.baeldung.com/circular-dependencies-in-spring) - [XML-Based Injection in Spring](https://www.baeldung.com/spring-xml-injection) -- More articles: [[next -->]](/spring-di-2) +- More articles: [[next -->]](../spring-di-2) diff --git a/spring-di/src/test/java/com/baeldung/methodinjections/StudentIntegrationTest.java b/spring-di/src/test/java/com/baeldung/methodinjections/StudentIntegrationTest.java deleted file mode 100644 index 5d326a99dd..0000000000 --- a/spring-di/src/test/java/com/baeldung/methodinjections/StudentIntegrationTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.baeldung.methodinjections; - -import org.junit.Assert; -import org.junit.Test; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; - -public class StudentIntegrationTest { - - @Test - public void whenLookupMethodCalled_thenNewInstanceReturned() { - AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); - Student student1 = context.getBean("studentBean", Student.class); - Student student2 = context.getBean("studentBean", Student.class); - - Assert.assertEquals(student1, student2); - Assert.assertNotEquals(student1.getNotification("Alex"), student2.getNotification("Bethany")); - context.close(); - } - - @Test - public void whenAbstractGetterMethodInjects_thenNewInstanceReturned() { - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); - StudentServices services = context.getBean("studentServices", StudentServices.class); - - Assert.assertEquals("PASS", services.appendMark("Alex", 76)); - Assert.assertEquals("FAIL", services.appendMark("Bethany", 44)); - Assert.assertEquals("PASS", services.appendMark("Claire", 96)); - context.close(); - } -}