Setter Dependency Injection with Map of Custom type Example

In some scenarios, we may need to inject a map of Custom object to another object.

Consider the example where Person has an Answer sheet which includes question and corresponding answer.

In this case, let us use Map which stores Question type as a key and Answer type 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 answerSheet where answerSheet is a Map of object.

It contains 3 setter methods one for each attribute.

It also contains showAnswerSheet() method to display the question and answers injected to the person object.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.kb.di;
 
import java.util.Map;
import java.util.Map.Entry;
 
public class Person {
    private int id;
    private String name;
    private Map<Question, Answer> answerSheet;
    
    public void showAnswerSheet(){
    for (Entry<Question, Answer> entry : answerSheet.entrySet()) {
        System.out.println(entry.getKey().getName()+"-->"+entry.getValue().getName());
    }
        
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public void setAnswerSheet(Map<Question, Answer> answerSheet) {
        this.answerSheet = answerSheet;
    }
}
package com.kb.di;

import java.util.Map;
import java.util.Map.Entry;

public class Person {
	private int id;
	private String name;
	private Map<Question, Answer> answerSheet;
	
	public void showAnswerSheet(){
	for (Entry<Question, Answer> entry : answerSheet.entrySet()) {
		System.out.println(entry.getKey().getName()+"-->"+entry.getValue().getName());
	}
		
	}

	public void setId(int id) {
		this.id = id;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setAnswerSheet(Map<Question, Answer> answerSheet) {
		this.answerSheet = answerSheet;
	}
}

Create the Question class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.kb.di;
 
public class Question {
    int id;
    String name;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
package com.kb.di;

public class Question {
	int id;
	String name;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

Create the Answer class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.kb.di;
 
public class Answer {
    int id;
    String name;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
package com.kb.di;

public class Answer {
	int id;
	String name;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

Create a spring bean definition file

In this file, we used < property > tag with < map > to define the answerSheets

< entry > tag is used to inject Map’s key and value.

< key-ref > is used to reference the key defined as a bean

< value-ref > is used to reference the value defined as a bean

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?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="answerSheet">
            <map>
                <entry key-ref="question1" value-ref="answer1" />
                <entry key-ref="question2" value-ref="answer2" />
                <entry key-ref="question3" value-ref="answer3" />
            </map>
 
        </property>
    </bean>
    <bean id="question1" class="com.kb.di.Question">
        <property name="id" value="1"/>
        <property name="name" value="what is java" />
    </bean>
 
    <bean id="question2" class="com.kb.di.Question">
        <property name="id" value="2" />
        <property name="name" value="what is c++" />
    </bean>
    <bean id="question3" class="com.kb.di.Question">
        <property name="id" value="3" />
        <property name="name" value="what is c" />
    </bean>
 
    <bean id="answer1" class="com.kb.di.Answer">
        <property name="id" value="1" />
        <property name="name" value="java is object oriented langauge" />
    </bean>
 
    <bean id="answer2" class="com.kb.di.Answer">
        <property name="id" value="2"/>
        <property name="name" value="c++ is also object oriented langauge" />
    </bean>
 
    <bean id="answer3" class="com.kb.di.Answer">
        <property name="id" value="3"/>
        <property name="name" value="c is procedural oriented language" />
    </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="answerSheet">
			<map>
				<entry key-ref="question1" value-ref="answer1" />
				<entry key-ref="question2" value-ref="answer2" />
				<entry key-ref="question3" value-ref="answer3" />
			</map>

		</property>
	</bean>
	<bean id="question1" class="com.kb.di.Question">
		<property name="id" value="1"/>
		<property name="name" value="what is java" />
	</bean>

	<bean id="question2" class="com.kb.di.Question">
		<property name="id" value="2" />
		<property name="name" value="what is c++" />
	</bean>
	<bean id="question3" class="com.kb.di.Question">
		<property name="id" value="3" />
		<property name="name" value="what is c" />
	</bean>

	<bean id="answer1" class="com.kb.di.Answer">
		<property name="id" value="1" />
		<property name="name" value="java is object oriented langauge" />
	</bean>

	<bean id="answer2" class="com.kb.di.Answer">
		<property name="id" value="2"/>
		<property name="name" value="c++ is also object oriented langauge" />
	</bean>

	<bean id="answer3" class="com.kb.di.Answer">
		<property name="id" value="3"/>
		<property name="name" value="c is procedural oriented language" />
	</bean>
</beans>

Create a pom.xml file

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<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 Answer Sheet of a person.

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.kb.di;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class SetterDI  {
    
    public static void main(String[] args) {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("beans.xml");  
        Person person = (Person)applicationContext.getBean("person");
        person.showAnswerSheet();
    }
}
package com.kb.di;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SetterDI  {
	
	public static void main(String[] args) {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("beans.xml");  
        Person person = (Person)applicationContext.getBean("person");
        person.showAnswerSheet();
	}
}

Run the SetterDI class and see the output as below

About the Author

Karibasappa G C (KB)
Founder of javainsimpleway.com
I love Java and open source technologies and very much passionate about software development.
I like to share my knowledge with others especially on technology 🙂
I have given all the examples as simple as possible to understand for the beginners.
All the code posted on my blog is developed,compiled and tested in my development environment.
If you find any mistakes or bugs, Please drop an email to kb.knowledge.sharing@gmail.com

Connect with me on Facebook for more updates

Share this article on