在上篇博客中,我們使用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>