零基础学Struts
上QQ阅读APP看书,第一时间看更新

14.2 Spring的依赖注入

使用Spring的依赖注入可以为对象注入属性值。Spring的依赖注入分为两种,一种是通过Set方法注入依赖,一种是通过构造函数注入依赖。

14.2.1 通过Set方法注入依赖

下面来看如何通过Spring的依赖注入来为对象注入属性值。首先修改Student类,为其添加name属性以及name属性的setter和getter方法,代码如下所示。

        package net.hncu.demo02;
        import net.hncu.demo01.Person;
        public class Student implements Person {
              //学生名字
              private String name;
              //实现Person接口中的go方法
              public void go(){
                    System.out.println( name + "去教室上课");
              }
              //设置学生名字
              public void setName(String name) {
                    this.name = name;
              }
              //返回学生名字
              public String getName() {
                    return name;
              }
        }

修改Teacher类,为其添加name属性以及name属性的setter和getter方法,代码如下所示。

        package net.hncu.demo02;
        import net.hncu.demo01.Person;
        public class Teacher   implements Person{
            //老师名字
            private String name;
            //实现Person接口中的go方法
        public void go(){
                System.out.println( name + "去教室讲课");
        }
        //设置老师名字
        public void setName(String name) {
                this.name = name;
        }
        //返回老师名字
        public String getName() {
                return name;
        }
    }

在Spring配置文件中创建Student和Teacher实例,并设置其name属性值,代码如下所示。

    <? xml version="1.0" encoding="UTF-8"? >
    <beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
        <! -- 创建Student实例,并设置其name属性值 -->
        <bean id="student" class="net.hncu.demo02.Student">
              <property name="name">
                  <value>小强</value>
              </property>
        </bean>
        <! -- 创建Teacher实例,并设置其name属性值 -->
        <bean id="teacher" class="net.hncu.demo02.Teacher">
              <property name="name">
                  <value>张老师</value>
              </property>
        </bean>
    </beans>

在主程序中取得Spring容器中的Teacher类和Student类实例,并调用实例的go()方法,代码如下所示。

    package net.hncu.demo02;
    import net.hncu.demo01.Person;
    import org.springframework.beans.factory.xml.XmlBeanFactory;
    import org.springframework.core.io.ClassPathResource;
    public class Test {
          public static void main(String[] args) {
                //创建ClassPathResource实例
                ClassPathResource isr = new ClassPathResource("beans2.xml");
                //创建XmlBeanFactory实例
                XmlBeanFactory factory = new XmlBeanFactory(isr);
                //Spring容器中获得Teacher实例
                      Person teacher = (Person) factory.getBean("teacher");
                      teacher.go();
                      //Spring容器中获得Student实例
                      Person student = (Person) factory.getBean("student");
                      student.go();
                }
          }

运行该Java程序,在控制台中打印输出如下语句,代码如下所示。

        张老师去教室讲课
        小强去教室上课

14.2.2 引用其他Bean

有时候实例需要调用其他类的实例,这时可以不用直接调用实例。而是在Spring容器中创建该实例,并将该实例注入到需要调用它的实例中。

修改Teacher类,添加属性student以及student属性的setter和getter方法,代码如下所示。

        package net.hncu.demo03;
        import net.hncu.demo01.Person;
        public class Teacher   implements Person{
              //老师名字
              private String name;
              //老师最喜欢的一个学生
              private Student student;
              //实现Person接口中的go方法
              public void go(){
                    System.out.println( name + "去给" + student.getName()+ "讲课");
              }
              //设置老师名字
              public void setName(String name) {
                    this.name = name;
              }
              //返回老师名字
              public String getName() {
                    return name;
              }
              //设置学生
              public Student getStudent() {
                    return student;
              }
              //返回学生
              public void setStudent(Student student) {
                    this.student = student;
              }
        }

在Spring配置文件中创建Student和Teacher实例,并设置其name属性值。还需要为Teacher实例设置其student属性值,可以使用ref标签直接引用当前IoC容器中的Student实例,代码如下所示。

        <? xml version="1.0" encoding="UTF-8"? >
        <beans
            xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
            <! -- 创建Student实例,并设置其name属性值 -->
            <bean id="student" class="net.hncu.demo03.Student">
                  <property name="name">
                      <value>小强</value>
                  </property>
            </bean>
            <! -- 创建Teacher实例,设置其name属性值,设置其student属性值-->
            <bean id="teacher" class="net.hncu.demo03.Teacher">
                  <property name="name">
                      <value>张老师</value>
                  </property>
                  <property name="student">
                      <ref bean="student"/>
                  </property>
            </bean>
        </beans>

在主程序中取得Spring容器中的Teacher类实例,并调用实例的go()方法,代码如下所示。

        package net.hncu.demo03;
        import net.hncu.demo01.Person;
        import org.springframework.beans.factory.xml.XmlBeanFactory;
        import org.springframework.core.io.ClassPathResource;
        public class Test {
              public static void main(String[] args) {
                    //创建ClassPathResource实例
                    ClassPathResource isr = new ClassPathResource("beans3.xml");
                    //创建XmlBeanFactory实例
                    XmlBeanFactory factory = new XmlBeanFactory(isr);
                    //Spring容器中获得Teacher实例
                    Person teacher = (Person) factory.getBean("teacher");
                    teacher.go();
              }
        }

运行该Java程序,在控制台中打印输出如下语句。

        张老师去给小强讲课

14.2.3 使用构造函数注入依赖

前面介绍了如何通过Set方法注入依赖,Spring还允许使用构造方法注入依赖。

修改Teacher类,为其添加构造函数,其中构造函数接受两个参数,分别为name和student,代码如下所示。

        package net.hncu.demo04;
        import net.hncu.demo01.Person;
        public class Teacher   implements Person{
              //老师名字
              private String name;
              //老师最喜欢的一个学生
              private Student student;
              public Teacher(){
              }
              //构造方法
              public Teacher(String name, Student student) {
                    this.name = name;
                    this.student = student;
              }
              //实现Person接口中的go方法
              public void go(){
                    System.out.println( name + "去给" + student.getName()+ "讲课");
              }
              //设置老师名字
              public void setName(String name) {
                    this.name = name;
              }
              //返回老师名字
              public String getName() {
                    return name;
              }
              //设置学生
              public Student getStudent() {
                    return student;
              }
              //返回学生
              public void setStudent(Student student) {
                    this.student = student;
              }
        }

在Spring配置文件中创建Student实例,并设置其name属性值。创建Teacher实例,通过构造函数设置其name和student属性值,代码如下所示。

        <? xml version="1.0" encoding="UTF-8"? >
        <beans
            xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
            <! -- 创建Student实例,并设置其name属性值 -->
            <bean id="student" class="net.hncu.demo04.Student">
                  <property name="name">
                      <value>小强</value>
                  </property>
            </bean>
            <! -- 创建Teacher实例,通过构造函数设置其namestudent属性值-->
            <bean id="teacher" class="net.hncu.demo04.Teacher">
                  <constructor-arg>
                      <value>张老师</value>
                  </constructor-arg>
                  <constructor-arg>
                      <ref bean="student"/>
                  </constructor-arg>
            </bean>
        </beans>

在主程序中取得Spring容器中的Teacher类实例,并调用实例的go()方法,代码如下所示。

        package net.hncu.demo04;
        import net.hncu.demo01.Person;
        import org.springframework.beans.factory.xml.XmlBeanFactory;
        import org.springframework.core.io.ClassPathResource;
        public class Test {
              public static void main(String[] args) {
                    //创建ClassPathResource实例
                    ClassPathResource isr = new ClassPathResource("beans3.xml");
                    //创建XmlBeanFactory实例
                    XmlBeanFactory factory = new XmlBeanFactory(isr);
                    //Spring容器中获得Teacher实例
                    Person teacher = (Person) factory.getBean("teacher");
                    teacher.go();
            }
        }

运行该Java程序,在控制台中打印输出如下语句。

        张老师去给小强讲课