Setter Dependency Injection with Map of String
In some scenarios, we may need to inject a map of strings to an object.
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 Setter Dependency Injection
Create a class called Person
It contains 3 attributes id,name and phoneNos where phoneNos is a map.
It contains 3 setter methods one for each attribute.
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 void showPhoneNos() {
- for (Entry<String, String> entry : phoneNos.entrySet()) {
- System.out.println(entry.getKey()+"-->"+entry.getValue());
- }
- }
- public void setId(int id) {
- this.id = id;
- }
- public void setName(String name) {
- this.name = name;
- }
- public void setPhoneNos(Map<String, String> phoneNos) {
- this.phoneNos = phoneNos;
- }
- }
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 void showPhoneNos() { for (Entry<String, String> entry : phoneNos.entrySet()) { System.out.println(entry.getKey()+"-->"+entry.getValue()); } } public void setId(int id) { this.id = id; } public void setName(String name) { this.name = name; } public void setPhoneNos(Map<String, String> phoneNos) { this.phoneNos = phoneNos; } }
Create a spring bean definition file
In this file, we used < property > 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">
- <property name="id" value="1"></property>
- <property name="name" value="Raj"></property>
- <property name="phoneNos">
- <map>
- <entry key="mobile" value="9999967891" />
- <entry key="landline" value="080789345" />
- </map>
- </property>
- </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"> <property name="id" value="1"></property> <property name="name" value="Raj"></property> <property name="phoneNos"> <map> <entry key="mobile" value="9999967891" /> <entry key="landline" value="080789345" /> </map> </property> </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 SetterDI 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 SetterDI {
- 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 SetterDI { public static void main(String[] args) { ApplicationContext applicationContext=new ClassPathXmlApplicationContext("beans.xml"); Person person = (Person)applicationContext.getBean("person"); person.showPhoneNos(); } }
Run the SetterDI class and see the output as below