上一節中,我們學了繼承配置和通過構造函數來裝配bean,通過繼承配置的方式來裝配bean,可以實現子類和父類的功能。通過構造函數來裝配bean,要注意的就是相應的有參構造函數要存在,當然無參的構造函數也應該存在。這一節中,我們來學習自動裝配。
本文中涉及到的bean有兩個,一個是Dog.java,另一個是Master.java,其中Master.java中有一個Dog屬性。
有四種自動裝配的類型:
1、byName 尋找和屬性名相同的bean。若找不到,則裝不上
2、byType 尋找和屬性類型相同的bean。若找不到,則裝不上,若找到多個,拋異常
3、constructor 查找和bean的構造參數一致的一個或多個bean。若找不到或者找到多個,拋異常。按照參數的類型裝配
4、autodetect (3)和(2)之間選一個方式,不確定到底選擇哪個
5、no:不自動裝配,這是autowire的默認值。
6、default :這個需要在<beans default-autowire="指定" />
PS:不推薦使用自動裝配,因爲自動裝配往往不能直觀的看出哪些屬性被配置了。
PS:如果<beans>指定了default-autowire屬性,那麼所有bean的default屬性值就是這個。如果沒有指定default-autowire屬性,則default-autowire的默認值是no。
PS:如果使用自動裝配同時使用手動裝配,那麼自動裝配的屬性,將被手動裝配的屬性覆蓋。
(1)ByName
當程序執行到標註紅字的時候,就會調用配置文件中的代碼,實例化其中的bean對象。首先在內存中創建一個dog對象,然後創建一個master對象。master對象中有一個dog屬性,此時,就會根據autowire的方式來配置這個屬性,此時是“ByName”,那麼程序就會根據id來查找,看是否有一個“dog”的對象,發現有,ok成功裝配。這就是“ByName”的自動裝配方式。當然,如果dog對象的id不是“dog”而是“cat”或是其他的名稱,再次運行的話會發現程序報錯。這就從側面說明了,我們的dog對象的id不是隨便取的,而是和master屬性中的Dog類型的引用名稱一致的。
(2)ByType
如果選擇了ByType類型,那麼就會根據dog所屬的類來尋找對象,如果找到的不唯一,那麼還是會報錯的。
可以看到,此時的id是不是dog都已經無所謂了。
(3)constructor
當你選擇了這種方式的時候,在master.java中必須要有一個這樣的構造函數
當然,如果master中還有別的構造函數,比如說什麼Master(Dog dog,String name)之類的,那就GG了。
(4)autodetect
(5)default
在beans中,我們可以用default-autowire="指定類型"的方式來設定默認的裝配類型,如果沒有指定的話那麼就是“no”
在對象的配置中,我們也可以設置“autowire”,默認的情況下是“default”,也就是你在beans中設置的匹配類型。如果自己設置的話,那就以自己設置的爲準。
-----------------------------------------------------------------------------------------------------
引入特殊的bean
有時候我們需要對數據庫進行設置,大家都知道,數據庫的配置信息我們一般是放在properties配置文件中的,在Spring中,有一個特殊的bean來幫助我們實現對配置文件的讀取。
如果我們想引入兩個配置文件的話,我們只需要在location中加入另一個配置文件的路徑,用","隔開。