logo

Constructor Dependency Injection With Non-String Map


Show

In this useful guide, we will show you how we can perform the Constructor Dependency Injection with the Non-String Map with the help of a simple example. Here, we will use the map as the answer that has the answer and the User. Here, we are using both key and value pairs as an object. Here, the Answer contains the information like answerId, answer and postedDate whereas the User has the information like userId, username, emailId.

As we discussed in the previous examples, here, we are using the example of a forum where one question can have multiple answers.

Question.Java

This class includes three properties, two constructors, and a displayInfo() method to print the information.

package com.intellinuts;  

import java.util.Iterator;  
import java.util.Map;  
import java.util.Set;  
import java.util.Map.Entry;  

public class Question {  
private int id;  
private String name;  
private Map<Answer,User> answers;  

public Question() {}  
public Question(int id, String name, Map<Answer, User> answers) {  
    super();  
   this.id = id;  
    this.name = name;  
    this.answers = answers;  
}  

public void displayInfo(){  
    System.out.println("question id:"+id);  
    System.out.println("question name:"+name);  
    System.out.println("Answers....");  
    Set<Entry<Answer, User>> set=answers.entrySet();  
    Iterator<Entry<Answer, User>> itr=set.iterator();  
    while(itr.hasNext()){  
        Entry<Answer, User> entry=itr.next();  
        Answer ans=entry.getKey();  
        User user=entry.getValue();  
        System.out.println("Answer Information:");  
        System.out.println(ans);  
        System.out.println("Posted By:");  
        System.out.println(user);  

    }  

}  

}  

Answer.Java

package com.intellinuts;  

import java.util.Date;  

public class Answer {  
private int id;  
private String answer;  
private Date postedDate;  
public Answer() {}  
public Answer(int id, String answer, Date postedDate) {  
    super();  
    this.id = id;  
    this.answer = answer;  
    this.postedDate = postedDate;  
}  

public String toString(){  
    return "Id:"+id+" Answer:"+answer+" Posted Date:"+postedDate;  

}  

}  

User.java

package com.intellinuts;  

public class User {  
private int id;  
private String name,email;  
public User() {}  
public User(int id, String name, String email) {  
    super();  
    this.id = id;  
    this.name = name;  
    this.email = email;  
}  

public String toString(){  
    return "Id:"+id+" Name:"+name+" Email Id:"+email;  

}  

}  

ApplicationContext.xml

In this class, the key-ref and value-ref attributes of the entry element are used to define the reference of the bean in the map.

<?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.0.xsd">  

<bean id="answer1" class="com.intellinuts.Answer">  
<constructor-arg value="1"></constructor-arg>  
<constructor-arg value="Java is a Programming Language"></constructor-arg>  
<constructor-arg value="12/12/2001"></constructor-arg>  
</bean>  

<bean id="answer2" class="com.intellinuts.Answer">  
<constructor-arg value="2"></constructor-arg>  
<constructor-arg value="Java is a Platform"></constructor-arg>  
<constructor-arg value="12/12/2003"></constructor-arg>  
</bean>  

<bean id="user1" class="com.intellinuts.User">  
<constructor-arg value="1"></constructor-arg>  
<constructor-arg value="Arun Kumar"></constructor-arg>  
<constructor-arg value="arun@gmail.com"></constructor-arg>  
</bean>  

<bean id="user2" class="com.intellinuts.User">  
<constructor-arg value="2"></constructor-arg>  
<constructor-arg value="Varun Kumar"></constructor-arg>  
<constructor-arg value="Varun@gmail.com"></constructor-arg>  

</bean>  

<bean id="q" class="com.intellinuts.Question">  
<constructor-arg value="1"></constructor-arg>  
<constructor-arg value="What is Java?"></constructor-arg>  
<constructor-arg>  
<map>  
<entry key-ref="answer1" value-ref="user1"></entry>  
<entry key-ref="answer2" value-ref="user2"></entry>  
</map>  
</constructor-arg>  
</bean>  

</beans>

Test.Java

Here, this class will receive the bean from the applicationContext.xml file and invokes the displayInfo() method to give the information as output.

package com.intellinuts;  

import org.springframework.beans.factory.BeanFactory;  
import org.springframework.beans.factory.xml.XmlBeanFactory;  
import org.springframework.core.io.ClassPathResource;  
import org.springframework.core.io.Resource;  

public class Test {  
public static void main(String[] args) {  
    Resource r=new ClassPathResource("applicationContext.xml");  
    BeanFactory factory=new XmlBeanFactory(r);  

    Question q=(Question)factory.getBean("q");  
    q.displayInfo();  

}  

}