目录
一、构造注入是什么
二、构造注入重载
一、构造注入是什么
书接上回,我们已经知道了setter注入是什么了,这里的构造注入也就很好理解了。构造注入也就是Spring通过调用类对象中的构造方法来进行注入。接下来利用代码演示构造注入
1)先创建一个Student类,这里为了防止是setter注入,不写setter方法。但是一定要写构造方法,不然无法进行构造注入
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
2)在Spring的配置文件中配置关于Student类的Bean标签,这里将使用constructor-arg标签为构造方法中的属性进行赋值。构造方法中有几个属性就有几个constructor-arg标签,比如这里的构造方法中有两个属性,就要设置两个constructor-arg标签。在constructor-arg标签中看类型去赋值,这里是8种基本类型,那就使用value标签就可以了,不同的类型选择不同的标签即可。
<bean id="student" class="com.gl.demo.model.Student">
<constructor-arg>
<value>张三</value>
</constructor-arg>
<constructor-arg>
<value>22</value>
</constructor-arg>
</bean>
3)利用 Spring提供的接口获取到student的类对象,根据打印结果可以知道这里的构造注入已经完成了
public void test4() {
ApplicationContext ctx =
new ClassPathXmlApplicationContext("applicationContext.xml");
Student student = (Student) ctx.getBean("student");
System.out.println(student);
}
写到这里就会发现,构造方法有重载啊,要是重载过程中都是只有一个参数呢?这时候Spring怎么去区别呢?
二、构造注入重载
利用刚刚的Student类,加两个构造方法的重载
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student(String name) {
this.name = name;
}
public Student(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
这里我只想为name属性进行赋值,那我只需要在Bean标签中写一个constructor-arg标签即可
<bean id="student" class="com.gl.demo.model.Student">
<constructor-arg>
<value>李四</value>
</constructor-arg>
</bean>
此时通过测试发现只对一个类属性赋值就成功了,其中没有对age赋值,所以这个就是默认值0
接下来,我只想对age进行赋值,使用刚刚的方式还可不可以呢?age是int类型,那这里的value值设置成数字就可以了。按照思路Student类中的age应该是21,接下来进行测试
<bean id="student" class="com.gl.demo.model.Student">
<constructor-arg>
<value>21</value>
</constructor-arg>
</bean>
哦豁,这里就出现了问题了,age没有进行赋值,反倒是name变成了21。这是为什么呢?
出现上面的问题,也要体会一下Spring的难处,这里都是一个参数,Spring也不知道到底是为哪一个参数进行注入赋值,因为Spring也是通过constructor-arg标签来定位的。接下来就是用另一种方法来解决这个问题,在constructor-arg标签中加上一个type属性指定构造方法中的类型即可
<bean id="student" class="com.gl.demo.model.Student">
<constructor-arg type="int">
<value>21</value>
</constructor-arg>
</bean>
同样的,如果是两个不同的参数,那就两个constructor-arg标签都写上type属性就可以了!