这一篇,介绍构造函数的注入方式及其原理。
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