目录

一、构造注入是什么

二、构造注入重载

一、构造注入是什么

书接上回,我们已经知道了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标签就可以了,不同的类型选择不同的标签即可。

张三

22

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标签即可

李四

此时通过测试发现只对一个类属性赋值就成功了,其中没有对age赋值,所以这个就是默认值0 

接下来,我只想对age进行赋值,使用刚刚的方式还可不可以呢?age是int类型,那这里的value值设置成数字就可以了。按照思路Student类中的age应该是21,接下来进行测试

21

哦豁,这里就出现了问题了,age没有进行赋值,反倒是name变成了21。这是为什么呢? 

出现上面的问题,也要体会一下Spring的难处,这里都是一个参数,Spring也不知道到底是为哪一个参数进行注入赋值,因为Spring也是通过constructor-arg标签来定位的。接下来就是用另一种方法来解决这个问题,在constructor-arg标签中加上一个type属性指定构造方法中的类型即可

21

同样的,如果是两个不同的参数,那就两个constructor-arg标签都写上type属性就可以了! 

参考文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: