1. 程式人生 > >Spring使用註解的方式配置bean的屬性-bean之間的引用關係

Spring使用註解的方式配置bean的屬性-bean之間的引用關係

  前邊我們講過了使用註解的方式來為類建立一個bean的例項,使其被SpringIOC容器管理。即先使用註解標註在類上,然後使用<context:component-san>標籤指定Spring掃描的包及其子包的類。下邊我們來講一講如何使用註解的方式來為bean的屬性賦值,即如何使用註解的方式指定bean之間的關聯關係。

  <context:component-scan>這個配置在IOC配置檔案中的標籤,除了可以指定要掃描的元件之外呢,它還有一個很重要的功能,就是會自動註冊一個AutowiredAnnotationBeanPostPorcessor後置處理器的例項,這個後置處理器可以自動的裝配具有@Autowired/@Resource/@Inject的屬性----即將存在於IOC容器中的bean的例項於相同屬性型別的變數裝配起來,即劃等號。

  在這三種註解中,@Autowired註解是最常見的註解。其實他們三個註解的功能都是一樣的,我們常用@Autowired,所以我們著重來講一講它。

  1. 功能

  @Autowired的功能是:可以自動裝配具有相容型別的單個bean的屬性。即被@Autowired註解標註的屬性,Spring會自動的從當前IOC容器中尋找匹配的屬性型別,然後將其賦值給這個屬性。

  2. 使用範圍

  @Autowired註解可以寫在屬性上、構造方法上、一切具有引數的方法上(如setter方法)。

  3. 特性

  預設情況下,所有被@Autowired註解標註的屬性,都必須在IOC容器中可以找到對應的屬性型別的bean,

否則會報異常,因為一旦@Autowired註解新增到屬性上,當IOC容器初始化時,Spring的自動匹配機制就會觸發,找不到就會包notfoundbean異常。如果我們不希望某個屬性不被設定也不會出異常,可以在這個屬性的@Autowired註解中新增屬性required="false"。

  ④ 衝突

  當IOC容器中存在多個與被@Autowired註解的屬性(介面)的型別相同的bean(介面的實現類),那麼Spring會去找預設的非限定類名去匹配屬性(這個非限定類名可以使用value屬性設定),如果不存在這個首字母小寫的非限定類名,也可以在set方法中的形參前加上@Qualify(beanName)來指定這個形參中屬性對應的bean的名稱、

 ⑤ 作用於陣列、集合、Map

  當@Autowired註解定義在陣列型別的屬性上時,Spring會將所有和陣列型別匹配的bean都裝配到這個陣列中

  當@Autowired註解定義在集合型別的屬性上時,Spring會檢查集合的型別,然後將IOC中所有滿足這個型別bean都裝配到這個集合中

 當@Autowired註解定義在Map型別的屬性上時,Spring會檢查Map的值的型別,然後將所有滿足條件的bean以beanName-bean的形式放到這個Map屬性中