在上篇博客中,我們使用Spring通過setter訪問器實現了對屬性的賦值,這種做法被稱為設值注入。除此之外Spring還提供了通過構造方法賦值的能力,成為構造注入。下面我們通過一個小demo來了解如何通過構造方法來注入值(因一個類中可能包含其他自定義類型的對象,所以我們采用Student類中包含Car類的實例來演示如何通過構造來給Student類屬性注入值)
Student類:
public class Student {
private String name;//學生姓名
private Integer age; //學生年齡
private Car car;//學生的汽車
@Override
//重寫toString()方法方便進行測試
public String toString() {
return "Student [name=" + name + ", age=" + age + ", car=" + car + "]";
}
//構造函數
public Student(String name, Integer age, Car car) {
System.out.println("我是帶參構造");
this.name = name;
this.age = age;
this.car = car;
}
public Student() {
System.out.println("我是無參構造");
}
//屬性訪問器
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
}
Car類:
public class Car {
//汽車顏色
private String color;
//屬性訪問器
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
//重寫toString()方法方便測試
@Override
public String toString() {
return "Car [color=" + color + "]";
}
}
applicationContext.xml配置:
<bean id="car" class="cn.wz.entity.Car">
<property name="color" value="白色"/>
</bean>
<bean id="stu" class="cn.wz.entity.Student">
<!--通過constructor-arg元素向構造方法傳入參數-->
<constructor-arg index="0" value="王哲"/>
<constructor-arg index="1" value="18"/>
<constructor-arg index="2" ref="car"/>
</bean>
測試代碼:
public class Test {
public static void main(String[] args) {
hasArgumentConstructor();
}
public static void hasArgumentConstructor(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
Student student = context.getBean("stu",Student.class);
System.out.println(student);
}
}
最終運行結果:
<bean id="car" class="cn.wz.entity.Car">
<property name="color" value="白色"/>
</bean>
<bean id="stu" class="cn.wz.entity.Student" p:name="王哲" p:age="18" p:car-ref="car" />
其測試用例運行效果是一樣的,但需要注意的是在使用這種方式給屬性注入值時一定要先導入P命名空間如圖所示:
<!-- List集合 --> <bean id="list" class="cn.wz.entity.Student"> <property name="list"> <list> <value>王哲</value> <value>張一銘</value> </list> </property> </bean> <!-- Set集合 --> <bean id="set" class="cn.wz.entity.Student"> <property name="set"> <set> <value>王哲</value> <value>張一銘</value> </set> </property> </bean> <!-- map集合 --> <bean id="map" class="cn.wz.entity.Student"> <property name="map"> <map> <entry key="wz"><value>王哲</value></entry> <entry key="zym"> <value>張一銘</value></entry> </map> </property> </bean> <!-- 數組 --> <bean id="array" class="cn.wz.entity.Student"> <property name="array"> <list> <value>王哲</value> <value>張一銘</value> </list> </property> </bean>