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();
- }
-}