构造器注入:通过构造方法注入就相当于给构造方法的参数传值,构造注入的优势是通过构造强制依赖关系,使得实例化出的bean对象一定是完整的或者可以使用的。
Salary类
public class Salary {
private BigDecimal money;
private int day;
public Salary(){}
public Salary(BigDecimal money, int day) {
this.money = money;
this.day = day;
}
@Override
public String toString() {
return "Salary{money = " + money + ", day = " + day + "}";
}
}
Employee类
public class Employee {
private String name;
private int age;
private Salary salary;
public Employee(){}
public Employee(String canshu1, int canshu2, Salary canshu3) { //注意参数
this.name = canshu1;
this.age = canshu2;
this.salary = canshu3;
}
@Override
public String toString() {
return "Employee{name = " + name + ", age = " + age + ", salary = " + salary + "}";
}
}
1. 根据参数类型传值
<bean name="salary" class="com.pojo.Salary">
<constructor-arg type="int" value="20"/>
<constructor-arg type="java.math.BigDecimal" value="20000.0564"/>
</bean>
<bean name="employee" class="com.pojo.Employee">
<constructor-arg type="java.lang.String" value="员工"/>
<constructor-arg type="int" value="25"/>
<constructor-arg type="com.pojo.Salary" ref="salary"/>
</bean>
type表示参数的类型:
-
对于引用类型的变量需要写全类型限定名,即 包名 + 类名。
-
对于基本数据类型直接写类型即可。
-
这种方式使用时最好是根据构造器的参数顺序写、当出现很多同类型的字段时,都容易出错。不推荐使用。
2. 根据参数列表的索引index传值
<bean name="salary" class="com.pojo.Salary">
<constructor-arg index="1" value="20"/>
<constructor-arg index="0" value="15611.0564"/>
</bean>
<bean name="employee" class="com.pojo.Employee">
<constructor-arg index="0" value="员工"/>
<constructor-arg index="1" value="25"/>
<constructor-arg index="2" ref="salary"/>
</bean>
index为构造器参数列表的索引
-
索引从0开始,到n - 1。
-
注入参数值的顺序可以颠倒,只要index没写错就行。
3. 通过参数名注入
<bean name="salary" class="com.pojo.Salary">
<constructor-arg name="day" value="24"/>
<constructor-arg name="money" value="20000"/>
</bean>
<bean name="employee" class="com.pojo.Employee">
<constructor-arg name="canshu1" value="员工"/>
<constructor-arg name="canshu2" value="25"/>
<constructor-arg name="canshu3" ref="salary"/>
</bean>
name为参数列表的参数名,不是字段名!
-
根据参数的名字传值,注意是参数名,不是字段名。
-
比较实用,一些编译器都会自动提示。