1. 程式人生 > >【Spring】xml配置注入方式

【Spring】xml配置注入方式

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]