注入:通过Spring的配置文件,为成员变量赋值
Set注入:Spring调用Set方法,通过配置文件,为成员变量赋值
构造注入:Spring调用构造方法,通过配置文件,为成员变量赋值
1.开发步骤
- 提供有参构造方法
public class Customer implements Serializable {
private String name;
private int age;
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Customer{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
- 通过Spring的配置文件来为成员变量赋值
<bean id="customer" class="com.zyh.basic.Customer">
<constructor-arg >
<value>tom</value>
</constructor-arg>
<constructor-arg >
<value>1</value>
</constructor-arg>
</bean>
一个构造参数,对应构造方法的一个构造参数,而且顺序是对应的
2.构造方法的重载
我们先来回顾一下什么是方法的重载
1.在同一个类中
2.方法名相同
3.形参列表不同(个数,类型,顺序)
4.方法的重载和返回值类型无关,和权限修饰符也无关
那么当构造方法发生重载的时候,我们想要构造注入为成员变量赋值需要注意什么细节呢?
2.1参数个数不同
public class Customer implements Serializable {
private String name;
private int age;
public Customer(String name) {
this.name = name;
}
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Customer{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
如果说,我们现在只想为name属性赋值的话,那么age就会有默认值
<bean id="customer" class="com.zyh.basic.Customer">
<constructor-arg >
<value>jack</value>
</constructor-arg>
</bean>
总结:
我们可以发现当构造参数个数不同的时候,我们可以通过
<constructor-arg >标签的数量来进行区分
2.2构造参数个数相同时
我们再来看看另外一种情况,当重载的构造方法中,有两个构造方法的参数都只有一个,那么Spring怎么知道我们要为哪一个成员变量赋值呢。这个时候我们就应该通过成员变量的类型来进行区分
通过标签引入type属性,进行类型区分
<bean id="customer" class="com.zyh.basic.Customer">
<constructor-arg type="int" >
<value>3</value>
</constructor-arg>
</bean>
public class Customer implements Serializable {
private String name;
private int age;
public Customer(String name) {
this.name = name;
}
public Customer(int age) {
this.age = age;
}
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Customer{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
type属性指明要赋值的参数类型
<bean id="customer" class="com.zyh.basic.Customer">
<constructor-arg type="int" >
<value>3</value>
</constructor-arg>
</bean>
这个时候,我们还会有一种疑惑,如果有两个成员变量的类型一样呢?
哈哈,大家想到这里肯定是有经过认真思考的,不过大家可能忘记了重载的定义,我们说重载指的是参数的个数,类型,顺序中有一个不同就构成了重载,但是注意,我们从来都没有说过,参数的名字不同构成重载,着就是语法报错,毕竟我们要记住,参数名是可以随便乱取的
3.注入总结
- set注入用得比较多
- 构造注入相对来说毕竟麻烦,毕竟有构造方法重载的问题
- Spring框架中,大量应用了set注入