當前位置:
首頁 > 知識 > Spring9:Autowire自動裝配:機制

Spring9:Autowire自動裝配:機制

為什麼Spring要支持Autowire(自動裝配)

先寫幾個類,首先定義一個Animal介面表示動物:

寫一個Animal介面的實現Tiger類:

寫一個動物園類Zoo,持有Animal介面,表示動物園中有動物:

配置一下spring文件,由於這個功能研究的是Autowire,因此我命名為autowire.xml:

Spring引入Autowire(自動裝配)機制就是為了解決標籤下

標籤過多的問題

標籤過多會引發兩個問題:

如果一個Bean中要注入的對象過多,比如十幾二十個(這是很正常的),那將導致Spring配置文件非常冗長,可讀性與維護性差

如果一個Bean中要注入的對象過多,配置麻煩且一不小心就容易出錯

因此,為了解決使用

標籤注入對象過多的問題,Spring引入自動裝配機制,簡化開發者配置難度,降低xml文件配置大小。

使用Autowire去除

標籤

下面來看一下使用Autowire去除

,autowire有兩處點:

可以配置在根標籤下,表示對全局起作用,屬性名為default-autowire

可以配置在標籤下,表示對當前起作用,屬性名為autowire

通常都是在根標籤下配置自動裝配比較多,default-autowire有四種取值:

no:默認,即不進行自動裝配,每一個對象的注入比如依賴一個

標籤

byName:按照beanName進行自動裝配,使用setter注入

byType:按照bean類型進行自動裝配,使用setter注入

constructor:與byType差不多,不過最終屬性通過構造函數進行注入

這裡研究的是去除

標籤,因此第一種不管;constructor裝配不太常用,因此這裡也不管,重點看最常用的byName與byType,至於具體使用哪種根據自己的業務特點進行相應的設置。

首先看一下byName,byName意為在spring配置文件中查詢beanName與屬性名一致的bean並進行裝配,若類型不匹配則報錯,autowire.xml如果使用byName進行屬性裝配,那麼將改成以下的形式:

看到Zoo中有一個名為animal的屬性,我將Tiger這個bean也命名為animal,由於Tiger是Animal介面的實現類,因此Spring可以找到beanName為animal的bean並自動裝配到Zoo的animal屬性中,這就是byName的自動裝配形式。

接著看一下byType的自動裝配形式,byType意為在spring配置文件中查詢與屬性類型一致的bean並進行裝配,若有多個相同類型則報錯(下一部分講),autowire.xml如果使用byType進行屬性裝配,那麼將改成以下的形式:

將Tiger命名為tiger(將bean命名為類名首字母小寫也比較符合規範),由於Tiger是Animal介面的實現類,因此Spring找到了Tiger並自動裝配到Zoo的animal屬性中,這就是byType的自動裝配形式。

byType裝配出現多個相同類型的bean及解決方案

前面演示了,byType的裝配方式是在Spring配置文件中尋找屬性類型與bean類型一致的bean,那麼有一個問題,就是如果屬性類型在Spring配置文件中有多個相同類型的bean會出現什麼樣的情況?為了探究一下這個問題,先定義另外一個Animal介面的實現類,叫做lion:

接著,在Spring配置文件中定義一下Lion這個類:

運行一個測試類,結果為:

意思很明顯:想要通過byType方式為animal進行裝配卻找到了兩個符合要求的bean,分別為tiger與lion,這導致了沒有唯一的bean可以對animal進行裝配。

這個問題有兩種解決方案,假如現在我要裝配的是lion這個bean,第一種解決方案是將不需要進行自動裝配的bean進行排除,對不需要進行自動裝配的bean設置屬性autowire-candidate=」false」即可

candidate顧名思義,即候選人的意思,autowire-candidate=」false」即這個bean我不想讓它作為自動裝配的候選者,既然tiger不是自動裝配的候選者,那麼animal類型在Spring容器中能自動裝配的也就只有一個lion了,Spring自動裝配lion,不會有問題。

第一種思路是排除那些不需要作為自動裝配候選者的bean,第二種思路就從相反邏輯出發,設置當發現有多個候選者的時候優先使用其中的哪個候選者,對要作為自動裝配候選者的bean設置primary=」true」即可

這種方式同樣也可以將lion裝配到animal屬性中而不會報錯。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 java學習吧 的精彩文章:

在公司幾年不被賞識一個偶然的Java技巧,完美翻身
程序員單身之謎 中國2500萬程序員生活狀態大調查
JAVA中方法的調用
查詢所有數據在前端用js進行分頁處理不再次走資料庫
參加計算機語言編程培訓為什麼首選Java?如何學?

TAG:java學習吧 |