1. 程式人生 > >Spring中通過註解來配置bean以及自動注入

Spring中通過註解來配置bean以及自動注入

今天看到一篇好文章,寫的很是詳細。再加上自己的理解和補充,成了這一篇文章。文後會獻上原文連結。

使用Spring經常性的需要:
通過註解配置bean
  基於註解配置bean
  基於註解來配置bean的屬性
  
-------------------------------今天就來看看是怎麼實現的------------------------------------------------
首先,就憑一個名叫註解的英文字串前面跟著一個@符號,是怎麼讓spring識別的。

因為spring有法寶----元件掃描

第一步:元件掃描

在classpath中掃描元件
  元件掃描(component scanning):Spring能夠從classpath下自動掃描,偵測和例項化具有特定註解的元件。
  特定的元件包括:
    

[email protected]:基本註解,標識了一個受Spring管理的元件
    [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註解,麻煩越少越好。