这一篇,介绍构造函数的注入方式及其原理。

   1、使用默认构造方法构造bean



public class Man implements Person{
    private int hour = 3;
    /**默认构造方法**/
    public Man(){}
    /**自定义构造方法**/
    public Man(int hour){
        this.hour = hour;
    }
    @Override
    public void sleep() {
        System.out.println("男人需要休息的时间为:" + hour);
    }
}

   其中Person是一个接口,只包含sleep方法的声明,这里不将其贴出来。

   配置文件person.xml,存放在src目录下

<?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-3.0.xsd">
    <!-- 注入Ban元素,通过构造方法 -->
    <!-- 使用默认构造方法 -->
    <bean id="manBean" class="com.spring.pojo.Man"/>             
</beans>

   在person.xml中,只是声明了一个bean,并没有加入其他处理,他默认会去调用Man的无参构造返方法,来初始化这个对象,接下来是测试其运行结果:

   

public class Test {
    public static void main(String[] args) {
        /**
         * 将XML配置文件加入到Spring应用上下文
         * ClassPathXmlApplicationContext:加载类路径下的XML配置文件
         **/
        ApplicationContext ac = new ClassPathXmlApplicationContext("person.xml");
        Man man = ac.getBean("manBean",Man.class);
        man.sleep();
    }
}

男人需要休息的时间为:3

   其等同于:

   Man man = new Man();与<bean>的作用一致。

   2、使用带参构造方法,该如何去初始化呢?

   配置文件修改为:

   

<?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-3.0.xsd">
    <!-- 注入Ban元素,通过构造方法 -->
    <!-- 使用默认构造方法 -->
    <bean id="manBean" class="com.spring.pojo.Man"/>
    <!-- 使用带参构造方法 -->
    <bean id="manBeanWithParam" class="com.spring.pojo.Man">
        <constructor-arg value="8"/>
    </bean>              
</beans>

   通过<constructor-arg>标签去使用构造方法,创建对象。

   使用测试:

   

public class Test {
    public static void main(String[] args) {
        /**
         * 将XML配置文件加入到Spring应用上下文
         * ClassPathXmlApplicationContext:加载类路径下的XML配置文件
         **/
        ApplicationContext ac = new ClassPathXmlApplicationContext("person.xml");
        //Man man = ac.getBean("manBean",Man.class);
        Man man = ac.getBean("manBeanWithParam",Man.class);
        man.sleep();
    }
}

男人需要休息的时间为:8

   可以看出使用了Man类中的带参构造方法,使用到这里,基本上已经了解到了其基本的使用方法,但是在使用使用中,可能出现这种

情况,就是构造方法中包含其他类的注入,那么遇到这样的情况,该如何注入呢?

   3、带参构造方法注入对象

   测试这个使用方式,我在Man类中加入衣服类。

   

public class Man implements Person{
    private Coat coat;
    private int hour = 3;
    /**默认构造方法**/
    public Man(){}
    /**自定义构造方法**/
    public Man(int hour){
        this.hour = hour;
    }
    /**衣服类,加入*/
    public Man(int hour,Coat coat){
        this.hour = hour;
        this.coat = coat;
    }
    @Override
    public void sleep() {
        System.out.println("男人需要休息的时间为:" + hour);
        coat.function();
                                                                                                                                             
    }
                                                                                                                                         
}

   Coat类,包含function方法,输出“保暖”。

   Person.xml配置内容:

   

<?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-3.0.xsd">
    <!-- 注入Ban元素,通过构造方法 -->
    <!-- 使用默认构造方法 -->
    <bean id="manBean" class="com.spring.pojo.Man"/>
    <!-- 使用带参构造方法 -->
    <bean id="manBeanWithParam" class="com.spring.pojo.Man">
        <constructor-arg value="8"/>
    </bean>
    <!-- 含有对象,构造 -->
    <bean id="coatBean" class="com.spring.pojo.Coat"></bean>
    <bean id="manBeanWithObj" class="com.spring.pojo.Man">
        <constructor-arg value="8"/>
        <constructor-arg ref="coatBean"/>
    </bean>      
</beans>

   使用<constructor-arg ref>来引用Coat类对象。

   测试如下:

   

public class Test {
    public static void main(String[] args) {
        /**
         * 将XML配置文件加入到Spring应用上下文
         * ClassPathXmlApplicationContext:加载类路径下的XML配置文件
         **/
        ApplicationContext ac = new ClassPathXmlApplicationContext("person.xml");
        //Man man = ac.getBean("manBean",Man.class);
        //Man man = ac.getBean("manBeanWithParam",Man.class);
        Man man = ac.getBean("manBeanWithObj",Man.class);
        man.sleep();
    }
}

   输入结果:男人需要休息的时间为:" + 8   保暖

  上述情况,基本上包含了实际的使用,但是一般使用较多的不是这种构造方法注入,下一节介绍更加常用的方式注入。


转载于:https://blog.51cto.com/793404905/1259202