2 Spring4 之Bean的配置

Spring4 之Bean的配置 java

1 IOC & DI 概述

  • IOC(Inversion of Control):其思想是反轉資源獲取的方向. 傳統的資源查找方式要求組件向容器發起請求查找資源. 做爲迴應, 容器適時的返回資源. 而應用了 IOC 以後, 則是容器主動地將資源推送給它所管理的組件, 組件所要作的僅是選擇一種合適的方式來接受資源. 這種行爲也被稱爲查找的被動形式
  • DI(Dependency Injection) — IOC 的另外一種表述方式:即組件以一些預先定義好的方式(例如: setter 方法)接受來自如容器的資源注入. 相對於 IOC 而言,這種表述更直接

 

2 配置 bean

  • 配置形式:基於 XML 文件的方式;基於註解的方式
  • Bean 的配置方式:經過全類名(反射)、經過工廠方法(靜態工廠方法 & 實例工廠方法)、FactoryBean
  • IOC 容器 BeanFactory & ApplicationContext 概述
  • 依賴注入的方式:屬性注入;構造器注入
  • 注入屬性值細節
  • 自動轉配
  • bean 之間的關係:繼承;依賴
  • bean 的做用域:singleton;prototype;WEB 環境做用域
  • 使用外部屬性文件
  • spEL
  • IOC 容器中 Bean 的生命週期
  • Spring 4.x 新特性:泛型依賴注入

3 在 Spring 的 IOC 容器裏配置 Bean

  • 在 xml 文件中經過 bean 節點來配置 bean

  • id:Bean 的名稱。
    • 在 IOC 容器中必須是惟一的
    • 若 id 沒有指定,Spring 自動將權限定性類名做爲 Bean 的名字
    • id 能夠指定多個名字,名字之間可用逗號、分號、或空格分隔
  • Spring IOC 容器讀取 Bean 配置建立 Bean 實例以前, 必須對它進行實例化. 只有在容器實例化後, 才能夠從 IOC 容器裏獲取 Bean 實例並使用.
  • Spring 提供了兩種類型的 IOC 容器實現.
    • BeanFactory: IOC 容器的基本實現.
    • ApplicationContext: 提供了更多的高級特性. 是 BeanFactory 的子接口.
    • BeanFactory 是 Spring 框架的基礎設施,面向 Spring 自己;ApplicationContext 面向使用 Spring 框架的開發者,幾乎全部的應用場合都直接使用 ApplicationContext 而非底層的 BeanFactory (主要使用ApplicationContext配置Bean)
    • 不管使用何種方式, 配置文件時相同的.

3.1 ApplicationContext

  • ApplicationContext 的主要實現類:
    • ClassPathXmlApplicationContext:從 類路徑下加載配置文件
    • FileSystemXmlApplicationContext: 從文件系統中加載配置文件
  • ConfigurableApplicationContext 擴展於 ApplicationContext,新增長兩個主要方法:refresh() 和 close(), 讓 ApplicationContext 具備啓動、刷新和關閉上下文的能力
  • ApplicationContext 在初始化上下文時就實例化全部單例的 Bean
  • WebApplicationContext 是專門爲 WEB 應用而準備的,它容許從相對於 WEB 根目錄的路徑中完成初始化工做

3.2 從 IOC 容器中獲取 Bean

  • 調用 ApplicationContext 的 getBean() 方法

3.3 依賴注入的方式

3.3.1 屬性注入

  • 屬性注入即經過 setter 方法注入Bean 的屬性值或依賴的對象
  • 屬性注入使用 <property> 元素, 使用 name 屬性指定 Bean 的屬性名稱,value 屬性或 <value> 子節點指定屬性值
  • 屬性注入是實際應用中最經常使用的注入方式

3.3.2 構造方法注入

  • 經過構造方法注入Bean 的屬性值或依賴的對象,它保證了 Bean 實例在實例化後就可使用。
  • 構造器注入在 <constructor-arg> 元素裏聲明屬性, <constructor-arg> 中沒有 name 屬性
  • 按索引匹配入參:(按順序匹配構造方法中的屬性)

  • 按類型匹配入參:

3.4 屬性注入的細節

3.4.1 字面值

  • 字面值:可用字符串表示的值,能夠經過 <value> 元素標籤或 value 屬性進行注入。
  • 基本數據類型及其封裝類、String 等類型均可以採起字面值注入的方式
  • 若字面值中包含特殊字符,可使用 <![CDATA[]]> 把字面值包裹起來。

3.4.2 引用其它 Bean 包含Bean

  • 組成應用程序的 Bean 常常須要相互協做以完成應用程序的功能. 要 使 Bean 可以相互訪問, 就必須在 Bean 配置文件中指定對 Bean 的引用
  • 在 Bean 的配置文件中, 能夠 經過 <ref> 元素或 ref 屬性爲 Bean 的屬性或構造器參數指定對 Bean 的引用.
  • 也能夠 在屬性或構造器裏包含 Bean 的聲明, 這樣的 Bean 稱爲內部 Bean,內部Bean不能被外部Bean引用,不用設id(設了也沒用)

 

3.4.3 內部 Bean

  • 當 Bean 實例 僅僅給一個特定的屬性使用時, 能夠將其聲明爲內部 Bean. 內部 Bean 聲明直接包含在 <property> 或 <constructor-arg> 元素裏, 不須要設置任何 id 或 name 屬性
  • 內部 Bean 不能使用在任何其餘地方

注入參數詳解:null 值和級聯屬性 數組

  • 可使用專用的 <null/> 元素標籤爲 Bean 的字符串或其它對象類型的屬性注入 null 值(意義不大)
  • 和 Struts、Hiberante 等框架同樣, Spring 支持級聯屬性的配置

3.4.4 集合屬性

  • 在 Spring中能夠經過一組內置的 xml 標籤(例如: <list>, <set> 或 <map>) 來配置集合屬性.
  • 配置 java.util.List 類型的屬性, 須要指定 <list> 標籤, 在標籤裏包含一些元素. 這些標籤能夠經過 <value> 指定簡單的常量值, 經過 <ref> 指定對其餘 Bean 的引用. 經過 <bean> 指定內置 Bean 定義. 經過 <null/> 指定空元素. 甚至能夠內嵌其餘集合.
  • 數組的定義和 List 同樣, 都使用 <list>
  • 配置 java.util.Set 須要使用 <set> 標籤, 定義元素的方法與 List 同樣.

  • Java.util.Map 經過 <map> 標籤訂義, <map> 標籤裏可使用多個 <entry> 做爲子標籤. 每一個條目包含一個鍵和一個值.
  • 必須在 <key> 標籤裏定義鍵
  • 由於鍵和值的類型沒有限制, 因此能夠自由地爲它們指定 <value>, <ref>, <bean> 或 <null> 元素.
  • 能夠將 Map 的鍵和值做爲 <entry> 的屬性定義: 簡單常量使用 key 和 value 來定義; Bean 引用經過 key-ref 和 value-ref 屬性定義
  • 使用 <props> 定義 java.util.Properties, 該標籤使用多個 <prop> 做爲子標籤. 每一個 <prop> 標籤必須定義 key 屬性.

3.4.5 使用 utility scheme 定義集合

  • 使用基本的集合標籤訂義集合時, 不能將集合做爲獨立的 Bean 定義, 致使其餘 Bean 沒法引用該集合, 因此沒法在不一樣 Bean 之間共享集合.
  • 可使用 util schema 裏的集合標籤訂義獨立的集合 Bean. 須要注意的是, 必須在 <beans> 根元素裏添加 util schema 定義

3.4.6 使用 p 命名空間

  • 爲了簡化 XML 文件的配置,愈來愈多的 XML 文件採用屬性而非子元素配置信息。
  • Spring 從 2.5 版本開始引入了一個新的 p 命名空間,能夠經過 <bean> 元素屬性的方式配置 Bean 的屬性。
  • 使用 p 命名空間後,基於 XML 的配置方式將進一步簡化

相關文章
相關標籤/搜索