English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Constructor injection (with dependent objects) example

If there are dependent objects in the collection, you can use list , set in ref elements to inject this information. Or Map.

In this example, we take "forum" as an example, where A question can have multiple answers. But Answer has its own information, such as answerId, answer, and postedBy. In this example, four pages are used:

Question.java Answer.java applicationContext.xml Test.java

In this example, the list we use can contain duplicate elements. You can use a set that only contains unique elements. However, you need to change the list set in applicationContext.xml and the list set in Question.java.

Question.java

This class contains three properties, two constructors, and the displayInfo() method to display information. Here, we use a list to contain multiple answers.

package com.w3codebox;
import java.util.Iterator;
import java.util.List;
public class Question {
private int id;
private String name;
private List<Answer> answers;
public Question() {}
public Question(int id, String name, List<Answer> answers) {
    super();
    this.id = id;
    this.name = name;
    this.answers = answers;
}
public void displayInfo() {
    System.out.println(id+" "+name);
    System.out.println("answers are:");
    Iterator<Answer> itr = answers.iterator();
    while (itr.hasNext()) {
        System.out.println(itr.next());
    }
}
}

Answer.java

This class has three properties id, name, and by constructor and toString() method.

package com.w3codebox;
public class Answer {
private int id;
private String name;
private String by;
public Answer() {}
public Answer(int id, String name, String by) {
    super();
    this.id = id;
    this.name = name;
    this.by = by;
}
public String toString() {
    return id+" "+name+" "+by;
}
}

applicationContext.xml

ref element is used to define a reference to another bean. Here, we use ref element The Properties to specify a reference to another bean.

<?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="ans1" class="com.w3codebox.Answer">
<constructor-arg value="1></constructor-arg>
<constructor-arg value="Java is a programming language"></constructor-arg>
<constructor-arg value="John"></constructor-arg>
</bean>
<bean id="ans2" class="com.w3codebox.Answer">
<constructor-arg value="2></constructor-arg>
<constructor-arg value="Java is a Platform"></constructor-arg>
<constructor-arg value="Ravi"></constructor-arg>
</bean>
<bean id="q" class="com.w3codebox.Question">
<constructor-arg value="111></constructor-arg>
<constructor-arg value="What is java?"></constructor-arg>
<constructor-arg>
<list>
<ref bean="ans1"/>
<ref bean="ans2"/>
</list>
</constructor-arg>
</bean>
</beans>

Test.java

This class retrieves a Bean from the applicationContext.xml file and calls the displayInfo method.

package com.w3codebox;
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();
    
}
}