From ae5c947fff12d52f42c4db04e7d1aadabf70d3bf Mon Sep 17 00:00:00 2001 From: Sumit Kumar Date: Fri, 8 Jul 2022 09:14:24 +0530 Subject: [PATCH] BAEL-5449 Instantiating Multiple Beans of the Same Class with Spring Annotations (#12446) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * added multiple bean instantiation * added module /spring-core-6 and formatting changes * resolved formatting issues as suggested * resolved formatting issues and changed package names * formatting changes in XML files * Reformatted XML files as per the instructions * FIXED Example in Section 3 and some changes in Pom.xml * changed xml config to Java config in solution 3 * Project updated to spring boot application * Removed unwanted spring dependencies from pom.xml * moved the project under new module spring-core-6 * added spring-core-6 module in parent's pom.xml * resolved formatting issue in parent's pom.xml * new module entry in parent's pom * final commit * Added spring-core-6 in parent's pom.xml  * fixed some merging issues. * added spring-core-6 module entry under jdk9-and-above profile in main pom * removed App.java from multibeaninstantiation directory --- pom.xml | 4 +- spring-core-6/pom.xml | 76 +++++++++++++++++++ .../solution1/Person.java | 17 +++++ .../solution1/PersonConfig.java | 17 +++++ .../solution1/SpringApp1.java | 11 +++ .../solution2/Person.java | 17 +++++ .../solution2/PersonConfig.java | 10 +++ .../solution2/PersonOne.java | 13 ++++ .../solution2/PersonTwo.java | 13 ++++ .../solution2/SpringApp2.java | 11 +++ .../solution3/Human.java | 33 ++++++++ .../solution3/MultiBeanFactory.java | 9 +++ .../solution3/Person.java | 49 ++++++++++++ .../solution3/PersonConfig.java | 22 ++++++ .../solution3/PersonFactoryPostProcessor.java | 33 ++++++++ .../solution3/SpringApp3.java | 11 +++ 16 files changed, 345 insertions(+), 1 deletion(-) create mode 100644 spring-core-6/pom.xml create mode 100644 spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/Person.java create mode 100644 spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/PersonConfig.java create mode 100644 spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/SpringApp1.java create mode 100644 spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/Person.java create mode 100644 spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonConfig.java create mode 100644 spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonOne.java create mode 100644 spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonTwo.java create mode 100644 spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/SpringApp2.java create mode 100644 spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/Human.java create mode 100644 spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/MultiBeanFactory.java create mode 100644 spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/Person.java create mode 100644 spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/PersonConfig.java create mode 100644 spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/PersonFactoryPostProcessor.java create mode 100644 spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/SpringApp3.java diff --git a/pom.xml b/pom.xml index 24aa678523..6daf0e3fa5 100644 --- a/pom.xml +++ b/pom.xml @@ -1246,6 +1246,7 @@ core-java-modules/core-java-networking-3 core-java-modules/core-java-strings core-java-modules/core-java-httpclient + spring-core-6 ddd-contexts docker-modules apache-httpclient-2 @@ -1328,6 +1329,7 @@ testing-modules/testing-assertions persistence-modules/fauna lightrun + spring-core-6 @@ -1400,4 +1402,4 @@ 31.0.1-jre - + \ No newline at end of file diff --git a/spring-core-6/pom.xml b/spring-core-6/pom.xml new file mode 100644 index 0000000000..92cd343234 --- /dev/null +++ b/spring-core-6/pom.xml @@ -0,0 +1,76 @@ + + + 4.0.0 + + com.baeldung + spring-core-6 + 0.0.1-SNAPSHOT + spring-core-6 + http://www.baeldung.com + + + UTF-8 + 11 + 11 + + + + + junit + junit + 4.11 + test + + + org.springframework.boot + spring-boot-starter-web + 2.0.0.RELEASE + + + + + + + + maven-clean-plugin + 3.1.0 + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + \ No newline at end of file diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/Person.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/Person.java new file mode 100644 index 0000000000..04fa6577ac --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/Person.java @@ -0,0 +1,17 @@ +package com.baeldung.multibeaninstantiation.solution1; + +public class Person { + private String firstName; + private String lastName; + + public Person(String firstName, String secondName) { + super(); + this.firstName = firstName; + this.lastName = secondName; + } + + @Override + public String toString() { + return "Person [firstName=" + firstName + ", secondName=" + lastName + "]"; + } +} \ No newline at end of file diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/PersonConfig.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/PersonConfig.java new file mode 100644 index 0000000000..ac05ffc0fa --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/PersonConfig.java @@ -0,0 +1,17 @@ +package com.baeldung.multibeaninstantiation.solution1; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class PersonConfig { + @Bean + public Person personOne() { + return new Person("Harold", "Finch"); + } + + @Bean + public Person personTwo() { + return new Person("John", "Reese"); + } +} \ No newline at end of file diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/SpringApp1.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/SpringApp1.java new file mode 100644 index 0000000000..c2bc70f3ba --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/SpringApp1.java @@ -0,0 +1,11 @@ +package com.baeldung.multibeaninstantiation.solution1; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringApp1 { + public static void main(String[] args) { + SpringApplication.run(SpringApp1.class, args); + } +} \ No newline at end of file diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/Person.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/Person.java new file mode 100644 index 0000000000..a1801d1fd2 --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/Person.java @@ -0,0 +1,17 @@ +package com.baeldung.multibeaninstantiation.solution2; + +public class Person { + private String firstName; + private String lastName; + + public Person(String firstName, String secondName) { + super(); + this.firstName = firstName; + this.lastName = secondName; + } + + @Override + public String toString() { + return "Person [firstName=" + firstName + ", secondName=" + lastName + "]"; + } +} \ No newline at end of file diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonConfig.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonConfig.java new file mode 100644 index 0000000000..da97314579 --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonConfig.java @@ -0,0 +1,10 @@ +package com.baeldung.multibeaninstantiation.solution2; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan("com.baeldung.multibeaninstantiation.solution2") +public class PersonConfig { + +} \ No newline at end of file diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonOne.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonOne.java new file mode 100644 index 0000000000..5d56082f71 --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonOne.java @@ -0,0 +1,13 @@ +package com.baeldung.multibeaninstantiation.solution2; + +import org.springframework.stereotype.Component; + +import com.baeldung.multibeaninstantiation.solution2.Person; + +@Component +public class PersonOne extends Person { + + public PersonOne() { + super("Harold", "Finch"); + } +} \ No newline at end of file diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonTwo.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonTwo.java new file mode 100644 index 0000000000..436bd0e96e --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonTwo.java @@ -0,0 +1,13 @@ +package com.baeldung.multibeaninstantiation.solution2; + +import org.springframework.stereotype.Component; + +import com.baeldung.multibeaninstantiation.solution2.Person; + +@Component +public class PersonTwo extends Person { + + public PersonTwo() { + super("John", "Reese"); + } +} \ No newline at end of file diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/SpringApp2.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/SpringApp2.java new file mode 100644 index 0000000000..328ba32777 --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/SpringApp2.java @@ -0,0 +1,11 @@ +package com.baeldung.multibeaninstantiation.solution2; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringApp2 { + public static void main(String[] args) { + SpringApplication.run(SpringApp2.class, args); + } +} \ No newline at end of file diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/Human.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/Human.java new file mode 100644 index 0000000000..d73bd9dfdc --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/Human.java @@ -0,0 +1,33 @@ +package com.baeldung.multibeaninstantiation.solution3; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.Assert; + +public class Human implements InitializingBean { + + private Person personOne; + + private Person personTwo; + + @Override + public void afterPropertiesSet() throws Exception { + Assert.notNull(personOne, "Harold is alive!"); + Assert.notNull(personTwo, "John is alive!"); + } + + /* Setter injection */ + @Autowired + public void setPersonOne(Person personOne) { + this.personOne = personOne; + this.personOne.setFirstName("Harold"); + this.personOne.setSecondName("Finch"); + } + + @Autowired + public void setPersonTwo(Person personTwo) { + this.personTwo = personTwo; + this.personTwo.setFirstName("John"); + this.personTwo.setSecondName("Reese"); + } +} \ No newline at end of file diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/MultiBeanFactory.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/MultiBeanFactory.java new file mode 100644 index 0000000000..1753d28d7e --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/MultiBeanFactory.java @@ -0,0 +1,9 @@ +package com.baeldung.multibeaninstantiation.solution3; + +import java.util.List; + +public interface MultiBeanFactory { + List getObject(String name) throws Exception; + + Class getObjectType(); +} \ No newline at end of file diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/Person.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/Person.java new file mode 100644 index 0000000000..a26aee121f --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/Person.java @@ -0,0 +1,49 @@ +package com.baeldung.multibeaninstantiation.solution3; + +import org.springframework.beans.factory.FactoryBean; +import org.springframework.beans.factory.annotation.Qualifier; + +@Qualifier(value = "personOne, personTwo") +public class Person implements FactoryBean { + private String firstName; + private String secondName; + + public Person() { + // initialization code (optional) + } + + @Override + public Class getObjectType() { + return Person.class; + } + + @Override + public Object getObject() throws Exception { + return new Person(); + } + + public boolean isSingleton() { + return true; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getSecondName() { + return secondName; + } + + public void setSecondName(String secondName) { + this.secondName = secondName; + } + + @Override + public String toString() { + return "Person [firstName=" + firstName + ", secondName=" + secondName + "]"; + } +} \ No newline at end of file diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/PersonConfig.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/PersonConfig.java new file mode 100644 index 0000000000..12b93ff860 --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/PersonConfig.java @@ -0,0 +1,22 @@ +package com.baeldung.multibeaninstantiation.solution3; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class PersonConfig { + @Bean + public PersonFactoryPostProcessor PersonFactoryPostProcessor() { + return new PersonFactoryPostProcessor(); + } + + @Bean + public Person person() { + return new Person(); + } + + @Bean + public Human human() { + return new Human(); + } +} \ No newline at end of file diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/PersonFactoryPostProcessor.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/PersonFactoryPostProcessor.java new file mode 100644 index 0000000000..7eb124e1b0 --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/PersonFactoryPostProcessor.java @@ -0,0 +1,33 @@ +package com.baeldung.multibeaninstantiation.solution3; + +import java.util.Map; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; + +public class PersonFactoryPostProcessor implements BeanFactoryPostProcessor { + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + Map map = beanFactory.getBeansWithAnnotation(Qualifier.class); + for (Map.Entry entry : map.entrySet()) { + createInstances(beanFactory, entry.getKey(), entry.getValue()); + } + } + + private void createInstances(ConfigurableListableBeanFactory beanFactory, String beanName, Object bean) { + Qualifier qualifier = bean.getClass() + .getAnnotation(Qualifier.class); + for (String name : extractNames(qualifier)) { + Object newBean = beanFactory.getBean(beanName); + beanFactory.registerSingleton(name.trim(), newBean); + } + } + + private String[] extractNames(Qualifier qualifier) { + return qualifier.value() + .split(","); + } +} \ No newline at end of file diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/SpringApp3.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/SpringApp3.java new file mode 100644 index 0000000000..10cb6c0c1a --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/SpringApp3.java @@ -0,0 +1,11 @@ +package com.baeldung.multibeaninstantiation.solution3; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringApp3 { + public static void main(String[] args) { + SpringApplication.run(SpringApp3.class, args); + } +} \ No newline at end of file