(一)set方法注入
使用最多的一种注入方式,非常简单,容易掌握
id="test1" class="com.Test">
<property name="age" value="20">property>
<property name="name" value="Richard">property>
(1)需要使用bean标签的property子标签
(2)property标签一定有name属性,通过name属性,找到并调用对应的set方法,为属性注入值。
property标签的name属性是age,会去调用setAge(args)方法;
property标签的name属性是name,会去调用setName(args)方法
(二)构造方法注入
Person类
public class Person {
private String name;
private Double salary;
private Dept dept;
private int age;
//不用写set方法了
public Person() {
}
public Person(String name, Double salary, Dept dept, int age) {
this.name = name;
this.salary = salary;
this.dept = dept;
this.age = age;
}
}
(1)配置bean,constructor-arg标签只有value属性:
<bean id="person1" class="com.Person">
<constructor-arg value="张三">constructor-arg>
<constructor-arg value="2500">constructor-arg>
<constructor-arg ref="dept1">constructor-arg>
<constructor-arg value="22">constructor-arg>
bean>
①有4个constructor-arg标签,会调用带4个参数的构造器去创建对象。
②倘若找不到对应的构造器,会抛出异常。例如:我们需要4参构造器,但目标类中没有4参构造器,此时抛出异常
③不再是调用无参构造器,因此不写无参构造器也能正常运行,还是建议写无参构造器。
④只有value属性,没有其他的约束条件,因此:
第一个constructor-arg标签与构造器的第一个参数对应,
第n个constructor-arg标签与构造器的第n个参数对应
⑤由第4点可知:constructor-arg标签的顺序必须和构造器的参数列表一一对应,否则抛出异常
(2)配置bean,constructor-arg标签有value+index属性
<bean id="person1" class="com.Person">
<constructor-arg ref="dept1" index="2">constructor-arg>
<constructor-arg value="张三" index="0">constructor-arg>
<constructor-arg value="22" index="3">constructor-arg>
<constructor-arg value="2500" index="1">constructor-arg>
bean>
index=”0”:与构造器的第1个参数对应。
index=”1”:与构造器的第2个参数对应。
……
(3)配置bean,constructor-arg标签有value+name属性
public Person(String name1, Double salary2, Dept dept3, int age4) {
super();
this.name = name1;
this.salary = salary2;
this.dept = dept3;
this.age = age4;
}
<bean id="person1" class="com.Person">
<constructor-arg value="张三" name="name1">constructor-arg>
<constructor-arg value="2500" name="salary2">constructor-arg>
<constructor-arg ref="dept1" name="dept3">constructor-arg>
<constructor-arg value="22" name="age4">constructor-arg>
bean>
name属性和构造器的形参名称一一对应
(4)配置bean, constructor-arg标签有value+type属性
"person1" class="com.Person">
value="张三" type="java.lang.String">
value="2500" type="java.lang.Double">
ref="dept1" type="com.Dept">
value="22" type="int">
如果2个参数的数据类型相同,就按顺序注入。代码如下:
public class Student {
private String name;
private String sex;
public Student() {
}
public Student(String name, String sex) {
this.name = name;
this.sex = sex;
}
}
<bean id="student1" class="Student">
<constructor-arg value="张三" type="java.lang.String">constructor-arg>
<constructor-arg value="男" type="java.lang.String">constructor-arg>
bean>
<bean id="student2" class="Student">
<constructor-arg value="男" type="java.lang.String">constructor-arg>
<constructor-arg value="张三" type="java.lang.String">constructor-arg>
bean>
构造注入比较繁琐,细节也较多,使用较少;Set方法注入,非常简单,容易理解,是最常用的方式