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技巧,完美翻身
※程序員單身之謎 中國2500萬程序員生活狀態大調查
※JAVA中方法的調用
※查詢所有數據在前端用js進行分頁處理不再次走資料庫
※參加計算機語言編程培訓為什麼首選Java?如何學?
TAG:java學習吧 |