带有非字符串集合(含有依赖对象)的构造函数注入示例

如果集合中有依赖对象,我们可以使用listsetmap内部的ref元素来注入这些信息。

在这个示例中,我们以Forum为例,其中一个问题可以有多个答案。但是答案有自己的信息,如answerId、answer和postedBy。这里有四个部分:

  1. Question.java
  2. Answer.java
  3. applicationContext.xml
  4. 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()方法将打印这些信息。

标签: spring, Spring教程, Spring技术, Spring语言学习, Spring学习教程, Spring下载, Spring框架, Spring框架入门, Spring框架教程, Spring框架高级教程, Spring面试题, Spring笔试题, Spring编程思想