依賴注入的方式
阿新 • • 發佈:2018-12-16
•Spring 支援 3 種依賴注入的方式
–屬性注入
•屬性注入即通過 setter 方法注入Bean 的屬性值或依賴的物件
•屬性注入使用 <property> 元素, 使用 name 屬性指定 Bean 的屬性名稱,value 屬性或 <value> 子節點指定屬性值
•屬性注入是實際應用中最常用的注入方式
<bean id="helloWorld" class="com.spring.HelloWorld"> <property name="userName" value="Spring"></property> </bean>
–構造器注入
通過程式碼詳解
構造一個Car類
public class Car { private String brand; private String corp; private int price; private int maxSpeed; public Car(String brand, String corp, int price) { this.brand = brand; this.corp = corp; this.price = price; } @Override public String toString() { return "Car{" + "brand='" + brand + '\'' + ", corp='" + corp + '\'' + ", price=" + price + ", maxSpeed=" + maxSpeed + '}'; } }
在applicarion.xml中給每個屬性賦值
<!--通過構造方法配置bean的屬性--> <bean id="car" class="com.spring.Car"> <constructor-arg value="Audi" index="0"></constructor-arg> <constructor-arg value="ShangHai" index="1"></constructor-arg> <constructor-arg value="300000" index="2"></constructor-arg> </bean>
通過index的序號依次給每個屬性賦值
檢視執行結果
Car car = (Car) ctx.getBean("car");
System.out.println(car);
Car{brand='Audi', corp='ShangHai', price=300000.0, maxSpeed=0}
我們現在再建立一個構造器程式碼如下
public class Car {
private String brand;
private String corp;
private double price;
private int maxSpeed;
public Car(String brand, String corp, double price) {
this.brand = brand;
this.corp = corp;
this.price = price;
}
public Car(String brand, String corp, int maxSpeed) {
this.brand = brand;
this.corp = corp;
this.maxSpeed = maxSpeed;
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", corp='" + corp + '\'' +
", price=" + price +
", maxSpeed=" + maxSpeed +
'}';
}
這兩個構造器屬性不同,屬性型別不同
我們再通過配置檔案給第二個構造器賦值
<bean id="car2" class="com.spring.Car">
<constructor-arg value="Baoma"></constructor-arg>
<constructor-arg value="Tianjin"></constructor-arg>
<constructor-arg value="200"></constructor-arg>
</bean>
按照我們的設想程式執行的結果應該是brand為Baoma,corp為Tianjin,maxSpeed為200
我們實際看看執行結果
car = (Car)ctx.getBean("car2");
Car{brand='Baoma', corp='Tianjin', price=200.0, maxSpeed=0}
實際我們看到執行結果並沒有達到我們的預期,這時應為配置檔案給屬性賦值時,由於出現兩個構造器,所以它無法判斷應該給那個構造器賦值,這種情況下,我們也無法通過Index標識每個屬性,此時我們可以通過按照型別匹配的方式
修改程式碼如下
<bean id="car" class="com.spring.Car">
<constructor-arg value="Audi" index="0"></constructor-arg>
<constructor-arg value="ShangHai" index="1"></constructor-arg>
<constructor-arg value="300000" index="2" type="double"></constructor-arg>
</bean>
<bean id="car2" class="com.spring.Car">
<constructor-arg value="Baoma" type="java.lang.String"></constructor-arg>
<constructor-arg value="Tianjin" type="java.lang.String"></constructor-arg>
<constructor-arg value="200" type="int"></constructor-arg>
</bean>
此時我們再看看執行結果
Car{brand='Audi', corp='ShangHai', price=300000.0, maxSpeed=0}
Car{brand='Baoma', corp='Tianjin', price=0.0, maxSpeed=200}
達到了我們的預期
在這個過程中,我們使用構造器注入屬性值可以指定引數的位置和引數的型別,以區分過載的構造器
•字面值:可用字串表示的值,可以通過 <value> 元素標籤或 value 屬性進行注入。
•基本資料型別及其封裝類、String 等型別都可以採取字面值注入的方式
•若字面值中包含特殊字元,可以使用 <![CDATA[]]> 把字面值包裹起來。
如:
<constructor-arg index="1">
<value><![CDATA[ShangHai]]></value>
</constructor-arg>
–工廠方法注入(很少使用,不推薦)
注:該文章其內容主要來源於學習尚矽谷視訊中的內容,為了方便以後學習,所以寫成了該文章