1. 程式人生 > >springIOC的自動裝配原理

springIOC的自動裝配原理

 

autowire 屬性共支援 5 種裝配型別方法。


1)no:autowire  採用的預設值,採用自動裝配。必須使用 ref 直接引用其他 Bean,這樣可以增加程式碼的可讀性,並且不易出錯。


(2)byName:以屬性名區分自動裝配。在容器中尋找與 JavaBean 的屬性名相同的JavaBean,並將其自動裝配到 JavaBean 中。如果用上面的例項來解釋,TeachFile 類的例項物件 teachFile 包含的兩個屬性分別是 Teacher 類和 Student 類的例項物件,而配置檔案中已經定義了這兩個類的例項。在定義 teachFile 例項時指定了自動裝配型別為“byName”,容器會自動尋找 teachFile 例項需要的屬性(即 teacher 和 student 兩個 JavaBean),並注入到 teachFile 例項中。此類自動裝配型別存在錯誤裝配 JavaBean 的可能,如果配置檔案中定義了與需要自動裝配的 JavaBean 屬性相同而型別不同的 JavaBean,那麼它會錯誤地注入不同型別的JavaBean。讀者可以將上面例項中的配置檔案修改一下,將 student 和 teacher 兩個JavaBean 的型別保持不變,將名字調換一下,便會出現此問題。這時自動裝配無法解決此問題,只能通過混合使用手動裝配來指定裝配哪個 JavaBean。


(3)byType:以屬性型別區分自動裝配。容器會自動尋找與 JavaBean 的屬性型別相同的 JavaBean 的定義,並將其注入到需要自動裝配的 JavaBean 中。如果將上面配置JavaBean 自動裝配的型別修改為 byType,也可以實現相同的結果。這種自動裝配型別也會出現無法自動裝配的情況。例如在配置檔案中再次新增一個Student 類或 Teacher 類的實現物件,byType 自動裝配型別會因為無法自動識別裝配哪一個 JavaBean 而丟擲org.springframework.beans.factory.UnsatisfiedDependencyException 異常。要解決此問題,只能通過混合使用手動裝配來指定裝配哪個 JavaBean。


(4)constructor:通過構造方法的引數型別自動裝配。此型別會使容器自動尋找與JavaBean 的構造方法的引數型別相同的 Bean,並注入到需要自動裝配的 JavaBean 中。它
與 byType 型別存在相同的無法識別自動裝配的情況。


(5)autudetect:這是最後一個自動裝配型別,它首先使用 constructor 方式自動裝配,然後使用 byType 方式。當然它也存在與 byType 和 constructor 相同的異常情況。建
議在使用自動裝配時,把容易出現問題的 JavaBean 使用手動裝配注入依賴屬性