1. 程式人生 > >Spring依賴注入 — 屬性自動裝配

Spring依賴注入 — 屬性自動裝配

設定屬性值的三種基本方式:

  • 在Bean定義檔案中使用<value>指定字串以及基本型別值。
  • 使用<ref>直接指定參考至其他Bean例項。
  • 使用<bean>標籤指定value屬性。

自動裝配方式

屬性值

說明

byName

容器將查詢與屬性名相同的Bean,然後自動注入到該屬性中,如果沒有找到,則該屬性將不會被注入。當然,使用自動裝配時,也可以顯式地注入Bean 的部分屬性。

byType

注入過程與byName 類似, 不同的是,容器查詢的是與屬性的設值方法引數型別相容的Bean

constructor

容器將試圖找出所有與構造方法的引數型別相容的

Bean ,然後確定某個合適的構造方法。如果沒有符合呼叫任何構造方法所需的Bean,則容器將丟擲UnsatisfiedDependencyException

autodetect

讓容器全面自動判斷。

no (預設值)

不採用自動裝配。

by Type

Person與Address類:

public class Person {

    private String name;

    private Address addr;

// 此處省略各Fieldgettersetter方法

}

public class Address {

    private

String city;

    private String province;

// 此處省略各Fieldgettersetter方法

}

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="byType">

<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>