【Spring】xml配置注入方式
阿新 • • 發佈:2018-12-21
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=9000000.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]