spring有多種依賴注入的形式,下面僅介紹spring通過xml進行IOC配置的方式:
一、Setter注入
set注入是最簡單常用的注入方式
package com.lhk.spring.demo1;
/**
* setter方法的屬性注入
*/
public class Car2 {
private String name;
private Double price;
public void setName(String name) {
this.name = name;
}
public void setPrice(Double price) {
this.price = price;
}
@Override
public String toString() {
return "Car2 [name=" + name + ", price=" + price + "]";
}
}
然後編寫spring的xml文件:
<!-- setter方式注入 -->
<bean id="car2" class="com.lhk.spring.demo1.Car2">
<property name="name" value="奔馳"></property>
<property name="price" value="500000"></property>
</bean>
<bean>
中的id屬性是bean的標識,必須唯一。class屬性是類的完全限定名,指明由哪個類來實例化。
<property>
標籤中的name就是就是注入方法名去掉前面的set,剩下的這一截首字母大小寫可不限。ref指向要注入的對象(id)。對象是引用實例,所以要用ref,如果是傳值,則用value。
另外要注意的是:property name只和注入方法名相關,和內部屬性名沒有關係。
測試方法:
@org.junit.Test
public void TestDemo2(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Car2 car2 = (Car2) ctx.getBean("car2");
System.out.println(car2);
}
輸出結果:
Car2 [name=奔馳, price=500000.0]
二、構造器注入
package com.lhk.spring.demo1;
/**
* 構造器方法的屬性注入
*/
public class Car {
private String name;
private Double price;
public Car(String name, Double price) {
super();
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "Car [name=" + name + ", price=" + price + "]";
}
}
然後編寫Spring的XML文件:
配置xml文件,spring提供了幾種方法:
1、指定參數名
<!-- 構造器方式注入 -->
<bean id="car" class="com.lhk.spring.demo1.Car">
<constructor-arg name="name" value="寶馬"></constructor-arg>
<constructor-arg name="price" value="1000000"></constructor-arg>
</bean>
<constructor-arg>
顧名思義就是構造函數的參數,name爲要注入參數的名字,value爲要注入的值。
2、智能識別
<!-- 構造器方式注入 -->
<bean id="car" class="com.lhk.spring.demo1.Car">
<constructor-arg value="寶馬"></constructor-arg>
<constructor-arg value="1000000"></constructor-arg>
</bean>
<constructor-arg>
沒有別的屬性。Spring這時會先按類型排序,同類型的按先後順序向構造函數參數賦值。所以如果完全按照構造函數的參數順序寫,肯定是沒有問題的。上面這樣寫,也是沒有問題的,兩個String類型的參數順序對了就行。
3、指定參數類型
<!-- 構造器方式注入 -->
<bean id="car" class="com.lhk.spring.demo1.Car">
<constructor-arg type="String" value="寶馬"></constructor-arg>
<constructor-arg type="String" value="1000000"></constructor-arg>
</bean>
和智能識別一樣,Spring會先按類型區分,同類型的按先後順序向構造函數參數賦值。
4、指定索引index
<!-- 構造器方式注入 -->
<bean id="car" class="com.lhk.spring.demo1.Car">
<constructor-arg index="0" value="寶馬"></constructor-arg>
<constructor-arg index="1" value="1000000"></constructor-arg>
</bean>
指定的索引順序一定要和類型匹配,不然會報錯。構造函數有2個相同類型的參數,指定索引可以解決此種情況。
注意index是從0開始。
測試方法:
@org.junit.Test
public void TestDemo1(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Car car = (Car) ctx.getBean("car");
System.out.println(car);
}
測試結果:
Car [name=寶馬, price=1000000.0]