[JAVA-8290] Split spring-di module

This commit is contained in:
Haroon Khan 2021-12-22 21:24:24 +00:00
parent 1824fbc9f4
commit a4771629fc
28 changed files with 159 additions and 77 deletions

View File

@ -652,6 +652,7 @@
<module>spring-data-rest-querydsl</module> <module>spring-data-rest-querydsl</module>
<module>spring-di</module> <module>spring-di</module>
<module>spring-di-2</module> <module>spring-di-2</module>
<module>spring-di-3</module>
<module>spring-drools</module> <module>spring-drools</module>
<module>spring-ejb</module> <module>spring-ejb</module>

View File

@ -9,4 +9,6 @@ This module contains articles about dependency injection with Spring
- [Spring Injecting Collections](https://www.baeldung.com/spring-injecting-collections) - [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) - [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) - [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)

View File

@ -14,37 +14,41 @@
<relativePath>../parent-spring-5</relativePath> <relativePath>../parent-spring-5</relativePath>
</parent> </parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.springframework</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-test</artifactId> <artifactId>spring-boot-starter-web</artifactId>
<version>${spring.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId> <artifactId>spring-boot-starter-data-jpa</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework</groupId> <groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId> <artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>javax.inject</groupId> <groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId> <artifactId>javax.inject</artifactId>
<version>${javax.inject.version}</version> <version>${javax.inject.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>
@ -74,7 +78,7 @@
</build> </build>
<properties> <properties>
<spring-boot.version>2.3.1.RELEASE</spring-boot.version> <spring-boot.version>2.6.1</spring-boot.version>
<aspectj-plugin.version>1.11</aspectj-plugin.version> <aspectj-plugin.version>1.11</aspectj-plugin.version>
<javax.inject.version>1</javax.inject.version> <javax.inject.version>1</javax.inject.version>
</properties> </properties>

View File

@ -1,11 +1,10 @@
package com.baeldung.constructordi; 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.Engine;
import com.baeldung.constructordi.domain.Transmission; 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 @Configuration
@ComponentScan("com.baeldung.constructordi") @ComponentScan("com.baeldung.constructordi")

View File

@ -1,11 +1,10 @@
package com.baeldung.constructordi; package com.baeldung.constructordi;
import com.baeldung.constructordi.domain.Car;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.baeldung.constructordi.domain.Car;
public class SpringRunner { public class SpringRunner {
public static void main(String[] args) { public static void main(String[] args) {
Car toyota = getCarFromXml(); Car toyota = getCarFromXml();

View File

@ -5,8 +5,9 @@ import org.springframework.stereotype.Component;
@Component @Component
public class Car { public class Car {
private Engine engine;
private Transmission transmission; private final Engine engine;
private final Transmission transmission;
@Autowired @Autowired
public Car(Engine engine, Transmission transmission) { public Car(Engine engine, Transmission transmission) {

View File

@ -1,8 +1,9 @@
package com.baeldung.constructordi.domain; package com.baeldung.constructordi.domain;
public class Engine { public class Engine {
private String type;
private int volume; private final String type;
private final int volume;
public Engine(String type, int volume) { public Engine(String type, int volume) {
this.type = type; this.type = type;

View File

@ -1,7 +1,8 @@
package com.baeldung.constructordi.domain; package com.baeldung.constructordi.domain;
public class Transmission { public class Transmission {
private String type;
private final String type;
public Transmission(String type) { public Transmission(String type) {
this.type = type; this.type = type;

View File

@ -1,7 +1,6 @@
package com.baeldung.constructordi; 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.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.context.ApplicationContext; 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.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader; import org.springframework.test.context.support.AnnotationConfigContextLoader;
import com.baeldung.constructordi.domain.Car; import static org.assertj.core.api.Assertions.assertThat;
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = Config.class) @ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = Config.class)

View File

@ -10,10 +10,12 @@ import static org.junit.Assert.assertEquals;
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
@ContextConfiguration(classes = AspectJConfig.class) @ContextConfiguration(classes = AspectJConfig.class)
public class PersonUnitTest { public class PersonUnitTest {
@Test @Test
public void givenUnmanagedObjects_whenInjectingIdService_thenIdValueIsCorrectlySet() { public void givenUnmanagedObjects_whenInjectingIdService_thenIdValueIsCorrectlySet() {
PersonObject personObject = new PersonObject("Baeldung"); PersonObject personObject = new PersonObject("Baeldung");
personObject.generateId(); personObject.generateId();
assertEquals(1, personObject.getId()); assertEquals(1, personObject.getId());
assertEquals("Baeldung", personObject.getName()); assertEquals("Baeldung", personObject.getName());

8
spring-di-3/README.md Normal file
View File

@ -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)

45
spring-di-3/pom.xml Normal file
View File

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-di-3</artifactId>
<version>1.0-SNAPSHOT</version>
<name>spring-di-3</name>
<parent>
<groupId>com.baeldung</groupId>
<artifactId>parent-spring-5</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../parent-spring-5</relativePath>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
<properties>
<spring-boot.version>2.6.1</spring-boot.version>
</properties>
</project>

View File

@ -5,6 +5,5 @@ import org.springframework.context.annotation.Configuration;
@Configuration @Configuration
@ComponentScan(basePackages = "com.baeldung.methodinjections") @ComponentScan(basePackages = "com.baeldung.methodinjections")
public class AppConfig { public class AppConfig {
} }

View File

@ -1,9 +1,9 @@
package com.baeldung.methodinjections; package com.baeldung.methodinjections;
import java.util.Collection;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Collection;
@Component @Component
public class Grader { public class Grader {

View File

@ -1,13 +1,13 @@
package com.baeldung.methodinjections; package com.baeldung.methodinjections;
import java.util.ArrayList;
import java.util.Collection;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Collection;
@Component("schoolNotification") @Component("schoolNotification")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class SchoolNotification { public class SchoolNotification {
@ -19,7 +19,7 @@ public class SchoolNotification {
public SchoolNotification(String name) { public SchoolNotification(String name) {
this.name = name; this.name = name;
this.marks = new ArrayList<Integer>(); this.marks = new ArrayList<>();
} }
public String addMark(Integer mark) { public String addMark(Integer mark) {

View File

@ -1,15 +1,15 @@
package com.baeldung.methodinjections; package com.baeldung.methodinjections;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Lookup; import org.springframework.beans.factory.annotation.Lookup;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component("studentService") @Component("studentService")
public abstract class StudentServices { public abstract class StudentServices {
private Map<String, SchoolNotification> notes = new HashMap<>(); private final Map<String, SchoolNotification> notes = new HashMap<>();
@Lookup @Lookup
protected abstract SchoolNotification getNotification(String name); protected abstract SchoolNotification getNotification(String name);

View File

@ -0,0 +1 @@

View File

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

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="15 seconds" debug="false">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%d{ISO8601}]-[%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>

View File

@ -5,13 +5,10 @@ This module contains articles about dependency injection with Spring
### Relevant Articles ### Relevant Articles
- [The Spring @Qualifier Annotation](https://www.baeldung.com/spring-qualifier-annotation) - [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) - [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) - [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) - [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) - [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) - [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) - [XML-Based Injection in Spring](https://www.baeldung.com/spring-xml-injection)
- More articles: [[next -->]](/spring-di-2) - More articles: [[next -->]](../spring-di-2)

View File

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