Spring3之Bean的自動裝配

2021-09-01 10:20:19 字數 3132 閱讀 7044

[size=medium]

自動裝配就是指由spring來自動地注入依賴物件,無需人工參與。

目前spring3.0支援「no」、「byname 」、「bytype」、「constructor」四種自動裝配,預設是「no」指不支援自動裝配的,其中[color=red]spring3.0已不推薦使用之前版本的「autodetect」自動裝配[/color],推薦使用@autowired註解方式代替;如果想支援「autodetect」自動裝配,請將schema改為「spring-beans-2.5.xsd」。

自動裝配的好處是減少構造器注入和setter注入配置(其實就是少了標籤,但是bean裡面set方法還是必須的),減少配置檔案的長度。自動裝配通過配置標籤的「autowire」屬性來改變自動裝配方式。接下來讓我們挨著看下配置的含義。

● [b]default[/b]:表示使用預設的自動裝配,[color=red]預設的自動裝配需要在標籤中使用default-autowire屬性指定[/color],其支援「no」、「byname 」、「bytype」、「constructor」四種自動裝配

● [b]no[/b]:意思是不支援自動裝配,必須使用者明確指定依賴。

● [b]byname[/b]:通過設定bean標籤的屬性autowire="byname",意思是根據名字進行自動裝配,只能用於setter注入。比如我們有方法setbeana(mybeana mybeana),spring容器將查詢配置檔案裡標誌為beana的bean並注入,如果找不到,將什麼也不注入。[/size]

[size=medium]配置裡沒有了了,如果乙個bean有很多setter注入,通過「byname」方式能減少很多配置。[color=red]需要注意的是,在根據名字注入時,將把當前bean自己排除在外[/color]:比如「hello」bean類定義了「sethello」方法,則hello是不能注入到「sethello」的。

● [b]bytype[/b]:通過設定bean定義屬性autowire="bytype",意思是指根據型別注入,用於setter注入,比如如果指定自動裝配方式為「bytype」,而setbeana(mybeana mybeana)方法需要注入mybeana型別資料,則spring容器將查詢mybeana型別的bean,([color=red]將把當前bean自己排除在外[/color])如果找到乙個則注入該bean,如果找不到將什麼也不注入。[/size]

[size=medium][color=red]根據型別找到多個bean時,對於集合型別(如list、set)將注入所有匹配的候選者,而對於其他型別遇到這種情況可能需要使用「autowire-candidate」屬性為false來把指定bean從自動裝配候選者中移除,或使用「primary」屬性為true來指定某個bean為首選bean[/color]

● [b]constructor[/b]:通過設定bean定義屬性autowire="constructor",功能和「bytype」功能一樣,根據型別注入構造器引數,只是用於構造器注入方式。

● [b]autodetect[/b]:自動檢測是使用「constructor」還是「bytype」自動裝配方式,已不推薦使用。如果bean有空構造器那麼將採用「bytype」自動裝配方式,否則使用「constructor」自動裝配方式。此處要把3.0的xsd替換為2.5的xsd,否則會報錯。

[color=blue][b]不是所有型別都能自動裝配[/b]:[/color]

[color=darkred]不能自動裝配的資料型別[/color]:object、基本資料型別(date、charsequence、number、uri、url、class、int)等;

通過「」標籤default-autowire-candidates屬性指定的匹配模式,不匹配的bean將不能作為自動裝配的候選者,例如指定「*service,*dao」,將只把匹配這些模式的bean作為候選者,而不匹配的不會作為候選者;

通過將「」標籤的autowire-candidate屬性可被設為false,從而該bean將不會作為依賴注入的候選者。

[color=darkred]陣列型別、集合(set、collection、list)介面型別[/color]:將根據泛型獲取匹配的所有候選者並注入到陣列或集合中,如「listlist」將選擇所有的helloapi型別bean並注入到list中,而對於集合的具體型別將只選擇乙個候選者,如「arraylistlist」將選擇乙個型別為helloapi的bean注入,而不是選擇所有的helloapi型別bean進行注入;

[color=darkred]字典(map)介面型別[/color]:同樣根據泛型資訊注入,鍵必須為string型別的bean名字,值根據泛型資訊獲取,如「mapmap」 將選擇所有的helloapi型別bean並注入到map中,而對於具體字典型別如「hashmapmap」將只選擇型別為hashmap的bean注入,而不是選擇所有的helloapi型別bean進行注入

自動裝配注入方式能和配置注入方式一同工作嗎?當然可以,大家只需記住[color=red]配置注入的資料會覆蓋自動裝配注入的資料。[/color]

[color=blue]依賴檢查(spring3已經不推薦)[/color]

在spring的web應用中很可能發生沒有匹配的bean進行自動裝配,如果此種情況發生,只有在程式執行過程中發生了空指標異常才能發現錯誤,如果能提前發現該多好啊,這就是依賴檢查的作用。

依賴檢查:用於檢查bean定義的屬性都注入資料了,不管是自動裝配的還是配置方式注入的都能檢查,如果沒有注入資料將報錯,從而提前發現注入錯誤,只檢查具有setter方法的屬性。

spring3+也不推薦配置方式依賴檢查了,建議採用@required註解方式,測試時請將xml schema降低為2.5版本的,和自動裝配中「autodetect」配置方式的xsd一樣。

依賴檢查有四種方式:

● [b]none[/b]:預設方式,表示不檢查;

● [b]objects[/b]:檢查除基本型別外的依賴物件,如果有簡單資料型別的屬性為null,也不報錯;

● [b]******[/b]:對基本型別進行依賴檢查,包括陣列型別,其他依賴不報錯

● [b]all[/b]:對所以型別進行依賴檢查,配置方式為:dependency-check="all"[/size]

Spring 3 自動裝配bean

class com.csu.autowire.address p city changsha p street shaoshan id car class com.csu.factory.car p name benz p price 632275 p speed 290 p address ref...

Spring3之Bean的作用域

size medium 作用域即 scope 在物件導向程式設計中一般指物件或變數之間的可見範圍。而在spring容器中是指其建立的bean物件相對於其他bean物件的請求可見範圍。spring提供 singleton 和 prototype 兩種基本作用域,另外提供 request session...

常用spring3註解

configuration把乙個類作為乙個ioc容器,它的某個方法頭上如果註冊了 bean,就會作為這個spring容器中的bean。scope註解 作用域 lazy true 表示延遲初始化 service用於標註業務層元件 controller用於標註控制層元件 如struts中的action ...