再說自動裝配以前,咱們先聊一聊什麼是手動裝配。java
手動裝配就是咱們在先前講的那些,要本身給定屬性,而後賦值spa
Spring IOC容器能夠自動裝配Bean,須要作的僅僅實在<bean>的autowire屬性裏指定自動裝配的模式 code
byType(根據類型自動裝配):若IOC容器中有多個與目標Bean類型一致的Bean。在這種狀況下,Spring將沒法判斷哪一個Bean最合適該屬性,因此不能執行自動配置。xml
byName(根據名稱自動裝配):必須將目標Bean的名稱和屬性名設置的徹底相同。對象
constructor(經過構造器自動裝配):當Bean中存在多個構造器時,此種自動裝配方式會很複雜,不推薦使用 blog
從新寫一個新的包,建立幾個新的JavaBean,ci
Address:it
private String city;
private String street; class
Car: 容器
private String brand;
private double price;
Person:
private String name;
private Address address;
private Car car;
建立新的配置文件:beans-autowire.xml
咱們先按照先前的步驟溜一遍:
而後更改最後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風格的屬性名進行自動裝配,如有匹配成功的,則進行自動裝配,若匹配不成功,則不裝配
這個是根據類型配的,咱們先把以前改過的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已經本身報錯了,咱們仍是強制運行一下:
因此其實咱們不多用這個功能,弊大於利。