Constructor Dependency Injection with Collection of Integer / Long example
In some scenarios, we may need to inject a Collection of Integers/Long to an object rather than just one Integer/Long value.
In such cases, we inject a Collection of Integer/Long through a constructor.
Collection could be either List or Set but most of the requirements are best fit with List
Consider the example where one Person has multiple phone numbers
In this case, we are required to inject List of Long to person object.
Let us see the same in spring through Constructor Dependency Injection
Create a class called Person
It contains 3 attributes id,name and phoneNumbers where phoneNumbers is a list of Long
It also contains showPersonPhoneNumbers() method to display the list of phoneNumbers that we injected to the person object.
- package com.kb.di;
- import java.util.List;
- public class Person {
- private int id;
- private String name;
- private List<Long> phoneNumbers;
- public Person(int id, String name, List<Long> phoneNumbers) {
- super();
- this.id = id;
- this.name = name;
- this.phoneNumbers = phoneNumbers;
- }
- public void showPersonPhoneNumbers(){
- for (Long phoneNumber : phoneNumbers) {
- System.out.println(phoneNumber);
- }
- }
- }
package com.kb.di; import java.util.List; public class Person { private int id; private String name; private List<Long> phoneNumbers; public Person(int id, String name, List<Long> phoneNumbers) { super(); this.id = id; this.name = name; this.phoneNumbers = phoneNumbers; } public void showPersonPhoneNumbers(){ for (Long phoneNumber : phoneNumbers) { System.out.println(phoneNumber); } } }
Create a spring bean definition file
In this file, we used < constructor-arg > tag with < list > to define the list of Long
and value-type =java.lang.Long specifies that our list is of type Long.
If we want List of Integer then we can change the value-type to java.lang.Integer
< value > tag will take the values and convert it into the value-type specified
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
- <bean id="person" class="com.kb.di.Person">
- <constructor-arg value="1" type="int"></constructor-arg>
- <constructor-arg value="Raj"></constructor-arg>
- <constructor-arg>
- <list value-type="java.lang.Long">
- <value>9999912345</value>
- <value>9999956789</value>
- </list>
- </constructor-arg>
- </bean>
- </beans>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> <bean id="person" class="com.kb.di.Person"> <constructor-arg value="1" type="int"></constructor-arg> <constructor-arg value="Raj"></constructor-arg> <constructor-arg> <list value-type="java.lang.Long"> <value>9999912345</value> <value>9999956789</value> </list> </constructor-arg> </bean> </beans>
If we need to inject Set rather than List as in this case phone numbers needs to be unique, just change the above < list > tag to < set > tag.
And also make the phoneNumbers as Set in Person class instead of List
Create a pom.xml file
- <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>
- <groupId>Spring</groupId>
- <artifactId>SpringCore</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>jar</packaging>
- <name>SpringCore</name>
- <url>http://maven.apache.org</url>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-core</artifactId>
- <version>4.2.4.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>4.2.4.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- </project>
<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> <groupId>Spring</groupId> <artifactId>SpringCore</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>SpringCore</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
Create a ConstructorDI class
This class loads the spring beans using application context and calls the person class’s method to display the list of phone numbers.
- package com.kb.di;
- import org.springframework.beans.factory.BeanFactory;
- import org.springframework.beans.factory.xml.XmlBeanFactory;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import org.springframework.core.io.ClassPathResource;
- import org.springframework.core.io.Resource;
- public class ConstructorDI {
- public static void main(String[] args) {
- ApplicationContext applicationContext=new ClassPathXmlApplicationContext("beans.xml");
- Person person = (Person)applicationContext.getBean("person");
- person.showPersonPhoneNumbers();
- }
- }
package com.kb.di; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; public class ConstructorDI { public static void main(String[] args) { ApplicationContext applicationContext=new ClassPathXmlApplicationContext("beans.xml"); Person person = (Person)applicationContext.getBean("person"); person.showPersonPhoneNumbers(); } }
Run the ConstructorDI class and see the output as below