(三)基於XML的DI

舉例:項目di編程

一、注入分類數組

  Bean實例在調用無參構造器建立了空值對象後,就要對Bean的屬性進行初始化。初始化是由容器自動完成的,稱爲注入。根據注入方式的不一樣,經常使用的由有兩類:設值注入、構造注入。測試

  還有另一種,實現特定接口注入。因爲這種方式採用侵入式編程,污染了代碼,因此幾乎不用。 ui

 (1)設值注入spa

   設值注入是指,經過setter方法傳入被調用者的實例。這種注入方式簡單、直觀,於是Spring的依賴注入中大量使用。3d

  舉例:di01_1包對象

  

  當指定bean的某屬性值爲另外一bean的實例時,經過ref指定它們間的引用關係。ref的值必須爲某bean的id值。blog

  

  

  對於其它Bean對象的引用,除了<bean/>標籤的ref屬性外,還可使用<ref/>標籤。繼承

(2)構造注入接口

  構造注入是指,在構造者調用者實例的同時,完成被調用者的實例化。即便用構造器設置依賴關係。

  舉例:di01——2包

  

  

  <constructor-arg/>標籤中用於指定參數的屬性有:

  • name:指定參數名稱
  • index:指明該參數對應着構造器的第幾個參數,從0開始。不過,該屬性不要不行,但要注意,若參數類型相同,或之間有包含關係,則須要保證賦值順序要與構造器中的參數順序一致。

  另外,type屬性可用於指定其類型。基本類型直接寫類型關鍵字便可,非基本類型須要寫全限定性類名。

二、命名空間注入(瞭解)

三、集合屬性注入

  舉例:di03包

  

 (1)爲數組注入值

  

 (2)爲List注入值

  

 (3)爲Set注入值

  

 (4)爲Map注入值

  (5)爲Properties注入值

四、對於域屬性的自動注入  

  對於域屬性的注入,也可不在配置文件中顯示注入。能夠經過爲<bean/>標籤設置autowire屬性值,爲域屬性進行隱式自動注入。根據自動注入判斷標準的不一樣,能夠分爲兩種:

  byName:根據名稱自動注入

  byType:根據類型自動注入

(1)byName方式自動注入

    當配置文件中被調用者Bean的id值與代碼中調用者Bean類的屬性名相同時,可以使用byName方式,讓容器自動將被調用者Bean注入給調用者Bean。容器是經過調用者的Bean類的屬性名與配置文件的被調用者bean的id進行比較而實現自動注入的。

  舉例:di04——1包

  

  

(2)byType方式自動注入

  使用byType方式自動注入,要求:配置文件中被調用者bean的class屬性指定的類,要麼代碼中調用者Bean類的某域屬性類型同源。即要麼相同,要麼is-a關係(子類,或是實現類)。但這樣的同源的被調用bean只能有一個。多於一個,容器就不知道該匹配哪個了。

  舉例:di04_2包

  

五、使用SPEL注入

  SPEL,即Spring EL表達式語言。即在Spring配置文件中爲Bean的屬性注入值時,可直接使用SPEL表達式計算的結果。SPEL表達式以#開頭,後根一對大括號。

  舉例:di05包

  

  

其它用法:  
(1) <property name=「school」 value=「#{mySchool}」/> 
    引用另外一個bean。指定school的值爲另外一個Bean實例mySchool。

 

 六、使用內部Bean注入
  若不但願代碼直接訪問某個bean,即,在代碼中經過getBean方法獲取該Bean實例, 則可將該Bean的定義放入調用者bean定義的內部。
  舉例:di06包
        

 七、使用同類抽象Bean注入

  當若干Bean實例同屬一個類,且這些實例的屬性值又有相同值時,可使用抽象Bean,以簡化配置文件。

  抽象Bean是用於讓其餘bean繼承的。這個bean在Bean類中是不能經過getBean方法獲取的。設置abstract屬性爲true來指明該bean爲抽象bean,默認值爲false。不過,該bean不爲抽象bean時,也可被繼承。只不過,在應用中,用於被繼承的bean通常爲抽象bean。

  舉例:di07包

  

八、使用異類抽象Bean注入

  當若干不一樣的類對象具備相同的屬性,且其值也相同時,可以使用異類抽象Bean。

  舉例:di08包

  

九、爲應用指定多個Spring配置文件

  在實際應用裏,隨着應用規模的增長,系統中Bean數量也大量增長,致使配置文件變得很是龐大、臃腫。爲了不這種狀況得產生,提升配置文件得可讀性與可維護性,能夠將Spring配置文件分解成多個配置文件。

(1)以配置文件數組方式實現

  將全部配置文件的路徑定義爲一個String數組,並將其做爲容器初始化參數出現。其將與可變參的容器構造器匹配。

        

    各配置文件間爲並列關係,不分主次。

    舉例:di09_01

    

    

(2)以父子配置文件方式實現

  各配置文件中有一個總文件,總配置文件將各其它子文件經過<import/>引入。在Java代碼中只須要使用總配置文件對容器進行初始化便可。

   舉例:di09_02

5、基於註解得DI

  舉例:di-annotation項目

  對於DI使用註解,將再也不須要在Spring配置文件中聲明Bean實例。Spring中使用註解,須要在原有Spring運行環境基礎上再作一些改變,完成如下三個步驟。

  (1)導入AOP得jar包。由於註解得後臺實現用到了AOP編程。

    

  (2)須要更換配置文件頭,即添加相應得約束。

  (3)須要在Spring配置文件中配置組件掃描器,用於在指定得基本包中掃描註解。

                 

  一、定義Bean@Component

    須要在類上使用註解@Component,該註解得value屬性用於指定該bean得id值。

    舉例:di01

    

    另外,Spring還提供了3個功能基本和@Component等效得註解:

  • @Repository   用於對DAO實現類進行註解
  • @Service 用於對Service是實現進行註解
  • @Controller 用於對Controller實現類進行註解

  之因此建立這三個功能與@Componenet等效得註解,是爲了之後對其進行功能上得擴展,使它們不在等效。

二、Bean得做用域@Scope

  須要在類上使用註解@Scope,其value屬性用於指定做用域。默認爲sigleton。

  舉例:di01

  

三、基本類型屬性注入@Value

  須要在屬性上使用註解@Value,該註解得value屬性用於指定要注入得值。

  使用該註解完成屬性注入時,類中無需setter。固然無需setter。固然,若屬性有setter,則也可將其加到setter上。

  舉例:di01

  

四、按類型注入域屬性@Autowired

  須要在域屬性上使用註解@Autowired,該註解默認使用按類型自動裝配Bean的方式。

  使用該註解完成屬性注入時,類中無需setter。固然,若屬性有setter,則也可將其加到setter上。

  舉例:di02

  

五、按名稱注入域屬性@Autowired與@Qualifier

  須要在域屬性上聯合使用@Autowired與@Qualifier。@Autowired的value屬性用於指定要匹配的Bean的id值。一樣類中無需setter,也可加到setter上。

  舉例:di03

  

  @Autowired還有一個屬性required,默認值爲true,表示當匹配失敗後,會終止程序運行。若將其值設置爲false,則匹配失敗,將被忽略,未匹配的屬性值爲null。

  

六、域屬性註解@Resource

  Spring提供對規範中定義@Resource標準註解的支持。@Resource註解便可以按名稱匹配Bean,也能夠按類型匹配Bean。使用該註解,要求JDK必須是6及以上版本。

(1)按類型注入域屬性

  @Resource註解若不帶任何參數,則會按照類型進行Bean的匹配注入。

  舉例:di04

      

(2)按名稱注入域屬性

  @Resource註解指定其name屬性,則name的值即爲按照名稱進行匹配的Bean的id。

  舉例:di05

  

七、Bean的生命始末@PostConstruct與@PreDestory

  在方法上使用@PostConstructuct,與原來的init-method等效。在方法上使用@PreDestory,與destory-method等效。

  舉例:di05

  

八、使用JavaConfig進行配置(瞭解)

  JavaConfig,是在Spring3開始從一個獨立的項目併入到Spring中的。

九、使用juit4測試Spring(瞭解)

十、註解與XML共同使用

相關文章
相關標籤/搜索