Spring中通過註解來配置bean以及自動注入
今天看到一篇好文章,寫的很是詳細。再加上自己的理解和補充,成了這一篇文章。文後會獻上原文連結。
使用Spring經常性的需要:
通過註解配置bean
基於註解配置bean
基於註解來配置bean的屬性
-------------------------------今天就來看看是怎麼實現的------------------------------------------------
首先,就憑一個名叫註解的英文字串前面跟著一個@符號,是怎麼讓spring識別的。
因為spring有法寶----元件掃描
第一步:元件掃描
在classpath中掃描元件
元件掃描(component scanning):Spring能夠從classpath下自動掃描,偵測和例項化具有特定註解的元件。
特定的元件包括:
[email protected]:標識持久層元件
[email protected]:標識服務層(業務層)元件
[email protected]:標識表現層元件
【本質上所有的特定元件可以混用,因為在IOC裡面沒有絕對性的對這幾個元件進行名稱上的區分,但是建議按照標準進行使用】
對於掃描到的元件,Spring有預設的命名策略:使用非限定類名,第一個字母小寫。也可以在註解中通過value屬性值標識元件的名稱。
第二步:檔案配置
當在元件類上使用了特定的註解之後,還需要在Spring的配置檔案中宣告context:component-scan
-
base-package屬性指定一個需要掃描的基類包,Spring容器將會掃描這個基類包裡及其子包中的所有類
-
當需要掃描多個包時,可以使用逗號分隔
-
如果僅希望掃描特定的類而非基包下的所有類,可使用resource-pattern屬性過濾特定的類
,示例:
<context:component-sacn base-package="com.yl.spring.beans" resource-pattern="autowire/*.class"/> <context:include-filter>子節點表示要包含的目標類 <context:exclude-filter>子節點表示要排除在外的目標類
第三步:元件裝配
context:component-scan元素還會自動註冊AutowiredAnnotationBeanPostProcessor例項,該例項可以自動裝配具有@Autowired和@Resource、和@Inject註解的屬性
使用@Autowired自動裝配bean
@Autowired註解自動裝配具有相容型別的單個bean屬性
-構造器,普通欄位(即使是非public),一切只有引數的方法都可以應用@Autowired
-預設情況下,所有使用@Autowired註解的屬性都需要被設定,當Spring找不到匹配的bean裝配屬性時,會丟擲異常。若某一屬性允許不被設定,可以設定@Autowired註解的required屬性為false
-預設情況下,當IOC容器裡存在多個型別相容的bean時,通過型別的自動裝配將無法工作。此時可以在@Qualifiter註解裡提供bean的名稱,Spring允許對方法的入參標註 @Qualifiter已指定注入bean的名稱
[email protected]註解也可以應用在陣列型別的屬性上,此時Spring將會把所有匹配的bean進行自動匹配
[email protected]註解也可以應用在集合屬性上,此時Spring讀取該集合的型別資訊,然後自動裝配所有與之相容的bean
[email protected]註解用在java.util.Map上時,若該Map的鍵值作為String,那麼Spring將自動裝配與之Map值型別相容的bean,此時bean的名稱作為鍵值
使用@Resource或@Inject自動裝配bean
Spring還支援@Resource和@Inject註解,這兩個註解和@Autowired註解的功用類似
@Resource註解要求提供一個bean名稱的屬性,若該屬性為空,則自動採用標註處的變數或方法名作為bean的名稱
@Inject和@Autowired註解一樣也是按型別注入的bean,但是沒有required屬性
個人建議使用@Autowired註解,麻煩越少越好。