【Spring】IOC 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=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]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章