目录
一、构造注入是什么
二、构造注入重载
一、构造注入是什么
书接上回,我们已经知道了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;}@Overridepublic 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;}@Overridepublic 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属性就可以了!