Constructor Dependency Injection with Map of String
In some scenarios, we may need to inject a map of strings to an object.
In such cases, we inject a map of string through a constructor.
Consider the example where Person has phone numbers which can be of type mobile or landline.
In this case, let us use Map which stores phone type as a key and phone number as a value.
Let us see the same in spring through Constructor Dependency Injection
Create a class called Person
It contains 3 attributes id,name and phoneNos where phoneNos is a Map.
It also contains showPhoneNos() method to display the phone numbers injected to the person object.
- package com.kb.di;
- import java.util.List;
- import java.util.Map;
- import java.util.Map.Entry;
- public class Person {
- private int id;
- private String name;
- private Map<String, String> phoneNos;
- public Person(int id, String name, Map<String, String> phoneNos) {
- super();
- this.id = id;
- this.name = name;
- this.phoneNos = phoneNos;
- }
- public void showPhoneNos(){
- for (Entry<String, String> entry : phoneNos.entrySet()) {
- System.out.println(entry.getKey()+"-->"+entry.getValue());
- }
- }
- }
package com.kb.di; import java.util.List; import java.util.Map; import java.util.Map.Entry; public class Person { private int id; private String name; private Map<String, String> phoneNos; public Person(int id, String name, Map<String, String> phoneNos) { super(); this.id = id; this.name = name; this.phoneNos = phoneNos; } public void showPhoneNos(){ for (Entry<String, String> entry : phoneNos.entrySet()) { System.out.println(entry.getKey()+"-->"+entry.getValue()); } } }
Create a spring bean definition file
In this file, we used < constructor-arg > tag with < map > to define the phoneNos
< entry > tag is used to inject Map’s key and value.
- <?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 value="Raj"/>
- <constructor-arg>
- <map>
- <entry key="mobile" value="9999967891"/>
- <entry key="landline" value="080789345"/>
- </map>
- </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 value="Raj"/> <constructor-arg> <map> <entry key="mobile" value="9999967891"/> <entry key="landline" value="080789345"/> </map> </constructor-arg> </bean> </beans>
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 method to display the 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.showPhoneNos();
- }
- }
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.showPhoneNos(); } }
Run the ConstructorDI class and see the output as below