Spring的自動裝配機制
阿新 • • 發佈:2018-12-19
Spring IoC容器可以自動裝配(autowire)相互協作bean之間的關聯關係。因此,如果可能的話,可以自動讓Spring通過檢查BeanFactory中的內容,來替我們指定bean的協作者(其他被依賴的bean)。autowire一共有五種型別。由於autowire可以針對單個bean進行設定,因此可以讓有些bean使用autowire,有些bean不採用。autowire的方便之處在減少或者消除屬性或構造器引數的設定。在xml配置檔案中,可以在<bean/>元素中使用autowire屬性指定。 autowire屬性取值:
- no : 不啟用自動裝配。Autowire預設的值
- byName: 根據屬性名自動裝配。此選項將檢查容器並根據名字查詢與屬性完全一致的bean,並將其與屬性自動裝配。例如,在bean定義中將autowire設定為by name,而該bean包含master屬性(同時提供setMaster(..)方法),Spring就會查詢名為master的bean定義,並用它來裝配給master屬性。
- byType: 通過屬性的型別查詢JavaBean依賴的物件併為其注入。如果容器中存在一個與指定屬性型別相同的bean,那麼將與該屬性自動裝配。如果存在多個該型別的bean,那麼將會丟擲異常,並指出不能使用byType方式進行自動裝配。若沒有找到相匹配的bean,則什麼事都不發生,屬性也不會被設定。如果你不希望這樣,那麼可以通過設定dependency-check="objects"讓Spring丟擲異常。
- constructor: 與byType的方式類似,與byType的區別在於它不是使用Seter方法注入,而是使用構造子注入。如果在容器中沒有找到與構造器引數型別一致的bean,那麼將會丟擲異常。
- autodetect: 通過bean類的自省機制(introspection)來決定是使用constructor還是byType方式進行自動裝配。如果發現預設的構造器,那麼將使用byType方式。
注意:
1) 如果直接使用property和constructor-arg注入依賴的話,那麼將總是覆蓋自動裝配。而且目前也不支援簡單型別的自動裝配,這裡所說的簡單型別包括基本型別、String、Class以及簡單型別的陣列。
2) 當按Bean名稱自動裝配型別存在錯誤裝配JavaBean的可能。如果配置檔案中定義了與需要自動裝配的JavaBean的名稱相同而型別不同的JavaBean,那麼它會錯誤地注入不同型別的JavaBean。
3) 自動裝配型別也會出無法自動裝配的情況。例如,在配置檔案中再次新增一個JavaBean類的實現物件,byType自動裝配型別會因為無法自動識別裝配哪個JavaBean而丟擲org.springframework.beans.factory.UnsatisfiedDependecyException異常。要解決這個問題,只能通過混合使用手動裝配來拼寫裝配哪個JavaBean。