Spring教程-带有非字符串集合(含有依赖对象)的构造函数注入示例
带有非字符串集合(含有依赖对象)的构造函数注入示例
如果集合中有依赖对象,我们可以使用list,set或map内部的ref元素来注入这些信息。
在这个示例中,我们以Forum为例,其中一个问题可以有多个答案。但是答案有自己的信息,如answerId、answer和postedBy。这里有四个部分:
- Question.java
- Answer.java
- applicationContext.xml
- Test.java
在这个例子中,我们使用的是可以包含重复元素的列表(List),你也可以使用只包含唯一元素的集合(Set)。但是,你需要在applicationContext.xml文件中将list更改为set,在Question.java文件中将List更改为Set。
Question.java
这个类包含三个属性,两个构造函数和一个displayInfo()方法来打印信息。在这里,我们使用List来包含多个答案。
package cn.javatiku;
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
这个类有三个属性:id、name和by,并带有构造函数和toString()方法。
package cn.javatiku;
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
在这个XML文件中,我们使用ref元素来定义对另一个bean的引用。这里,我们使用ref元素的bean属性来指定对另一个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="cn.javatiku.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="cn.javatiku.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="cn.javatiku.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
这个类从applicationContext.xml文件中获取bean,并调用displayInfo方法。
package cn.javatiku;
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();
}
}
当你运行Test
类时,它将创建一个ID为111,问题为"What is java?"的Question
对象,并且它包含两个Answer
对象,分别为"Java is a programming language"和"Java is a Platform"。然后,displayInfo()
方法将打印这些信息。