Spring依賴注入 — 屬性自動裝配
設定屬性值的三種基本方式:
- 在Bean定義檔案中使用<value>指定字串以及基本型別值。
- 使用<ref>直接指定參考至其他Bean例項。
- 使用<bean>標籤指定value屬性。
自動裝配方式
屬性值 |
說明 |
byName |
容器將查詢與屬性名相同的Bean,然後自動注入到該屬性中,如果沒有找到,則該屬性將不會被注入。當然,使用自動裝配時,也可以顯式地注入Bean 的部分屬性。 |
byType |
注入過程與byName 類似, 不同的是,容器查詢的是與屬性的設值方法引數型別相容的Bean。 |
constructor |
容器將試圖找出所有與構造方法的引數型別相容的 |
autodetect |
讓容器全面自動判斷。 |
no (預設值) |
不採用自動裝配。 |
by Type
Person與Address類:
public class Person { private String name; private Address addr; // 此處省略各Field的getter、setter方法 } public class Address {
private private String province; // 此處省略各Field的getter、setter方法 } |
Bean配置:
<bean id="addr" class="cn.itcast.spring.auto_wire.Address"> <propertyname="province"value="湖南"/> <propertyname="city"value="長沙"/> </bean> <bean
id="person"
class="cn.itcast.spring.auto_wire.Person" <propertyname="name"value="張三"/> </bean> |
可見,在上面Bean定義檔案中並沒有為id為person的Bean例項指定其addr屬性,由於指定了autowire屬性為byType,所以例項化id為person的Person例項時,Spring會自動注入其相應型別的例項。這種方法會導致Bean定義檔案中的Address的型別定義只能出現一次。
byName
Bean配置
<bean id="addr" class="cn.itcast.spring.auto_wire.Address"> <propertyname="province"value="湖南"/> <propertyname="city"value="長沙"/> </bean> <bean id="person" class="cn.itcast.spring.auto_wire.Person" autowire="byName"> <propertyname="name"value="張三"/> </bean> |
以指定byName 來繫結,則Spring會判斷Bean 定義時id屬性上指定的別名與Setter 名稱是否一致來進行自動繫結。如果使用"byName"無法完成自動繫結,則對應的Setter 僅維持未繫結狀態。
Constructor
Person類:
public class Person { private String name; private Address addr; public Person(Address addr) { this.addr = addr; } public Address getAddr() { return addr; } public String getName() { return name; } public void setName(String name) { this.name = name; } } |
Bean配置
<bean id="addr" class="cn.itcast.spring.auto_wire.Address"> <propertyname="province"value="湖南"/> <propertyname="city"value="長沙"/> </bean> <bean id="person" class="cn.itcast.spring.auto_wire.Person" autowire="constructor"> <propertyname="name"value="張三"/> </bean> |
由於“autowire”設定為"constructor",在建立依賴關係時,Spring容器會試圖對比容器中的Bean例項型別,以及相關的構造方法上的引數型別,若在型別上符合,則選用該構造方法來建立Bean例項。
自動檢測(autodetect)
可以看到,運用一些自動繫結的方式,可以縮短定義檔案的編寫內容,如果還想再偷懶的話,可以設定為"autodetect',一切交給Spring來判斷。判斷順序:constructor——》 byType ——》 byName
<bean id="addr" class="cn.itcast.spring.auto_wire.Address"> <propertyname="province"value="湖南"/> <propertyname="city"value="長沙"/> </bean> <bean id="person" class="cn.itcast.spring.auto_wire.Person" autowire="autodetect"> <propertyname="name"value="張三"/> </bean> |