Bean的自動裝配


    再說自動裝配之前,我們先聊一聊什么是手動裝配。

    手動裝配就是我們在先前講的那些,要自己給定屬性,然后賦值

    Spring IOC容器可以自動裝配Bean,需要做的僅僅實在<bean>的autowire屬性里指定自動裝配的模式

    byType(根據類型自動裝配):若IOC容器中有多個與目標Bean類型一致的Bean。在這種情況下,Spring將無法判斷哪個Bean最合適該屬性,所以不能執行自動配置。

    byName(根據名稱自動裝配):必須將目標Bean的名稱和屬性名設置的完全相同。

    constructor(通過構造器自動裝配):當Bean中存在多個構造器時,此種自動裝配方式會很復雜,不推薦使用

    

    重新寫一個新的包,創建幾個新的JavaBean,

Address:

private String city;
private String street;

 

Car:

private String brand;
private double price;

 

Person:

private String name;
private Address address;
private Car car;

 

創建新的配置文件:beans-autowire.xml

byname

    我們先按照先前的步驟溜一遍:

  1. <bean id="address" class="com.figsprite.bean.autowire.Address"  
  2.       p:city="上海" p:street="陸家嘴"></bean>  
  3.     
  4. <bean id="car" class="com.figsprite.bean.autowire.Car"  
  5.       p:brand="奧迪" p:price="233"></bean>  
  6.     
  7. <bean id="person" class="com.figsprite.bean.autowire.Person"  
  8.       p:name="小雨" p:car-ref="car" p:address-ref="address"></bean>  

然后更改最后Person類的配置,讓其中的Car和Address改成自動裝配。

    先使用byName,我們此時Car和Address兩個對象<bean>的id剛好和我們在Person.java里的setter風格的屬性名保持一致,因此是沒有問題的,

<bean id="person" class="com.figsprite.bean.autowire.Person"
p:name="
小雨" autowire="byName"></bean>

    注意這里是setter風格的屬性名一致,而不是與類名一致,我們可以試着改掉Person.java里的屬性名

private String name;

private Address address;

private Car mycar;

同時也將setter方法改掉:

    發現car為空,如果僅僅只改屬性名(字段名),不改setter風格的屬性名,是沒什么異樣的。

    所以byName是根據bean的名字和當前bean的setter風格的屬性名進行自動裝配,若有匹配成功的,則進行自動裝配,若匹配不成功,則不裝配

byType

    這個是根據類型配的,我們先把之前改過的Person.java還原成最初的模樣:

 

 

我們改一下Car的容器id

<bean id="helloCar" class="com.figsprite.bean.autowire.Car"
p:brand="
奧迪" p:price="233"></bean>

如果我們還是使用byName,結果可想而知

Person{name='小雨', address=Address{city='上海', street='陸家嘴'}, car=null}

接下來我們換成byType:

Person{name='小雨', address=Address{city='上海', street='陸家嘴'}, car=Car{brand='奧迪', price=233.0}}

意料之中,不過之前有說過byType的致命弱點,不可以出現兩個相同類型的容器,這里,我們再加一個Car容器,優秀的IDEA已經自己報錯了,我們還是強制運行一下:

 

 

 

自動裝配的缺點

  1. 屬性要么都是用自動裝配的形式,要么不用,不能部分使用,部分不使用
  2. 要么byName,要么byType,不能兼用

    所以其實我們很少用這個功能,弊大於利。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM