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
