1. 程式人生 > 其它 >Spring IoC 容器

Spring IoC 容器

IoC(控制反轉)概念

控制反轉就是應用本身不負責依賴物件的建立及維護,依賴物件的建立及維護是由外部容器負責,這樣控制權就由應用轉移到外部容器,控制權的轉移就是所謂的反轉(控制權轉移帶來的好處就是降低了業務物件之間的依賴程度)

DI(依賴注入)概念

依賴注入就是物件之間的依賴關係是在執行時動態注入的(本質是利用 Java 的反射機制)

依賴注入分類
  • 構造器注入
  • 方法注入
  • 介面注入

注:Spring 僅支援構造器注入和方法注入

什麼是 IoC 容器

IoC 容器是 Spring 框架的核心(Spring core),通過實現 IoC(控制反轉)和 DI(依賴注入),以降低類與類之間的依賴程度(低耦合),從而奠定 Spring 框架的基石

IoC 容器 = 依賴注入(IoC) + 控制反轉(DI)

什麼是 Bean

在 IoC 容器中建立的類例項統稱為 Bean( Spring 中使用 Bean 來表示應用元件)

  • Spring 中使用 IoC容器(實現 IoC )來管理 Bean 的生命週期
  • Spring 中使用 Ioc容器(實現 DI )來自動完成 Bean 與 Bean 的依賴關係
BeanFactory 工廠
  • BeanFactory 是 Spring 框架最核心的介面,它提供了高階 IoC 的配置機制。BeanFactory 使管理不同型別的 Java 物件成為可能

BeanFactory 是 Spring 框架的基礎設施(屬於底層封裝元件,專門供 Spring 框架使用)

ApplicationContext (應用上下文)
  • ApplicationContext 是建立在 BeanFactory 基礎之上,提供了更多面嚮應用的功能。一般稱BeanFactory為IoC容器,而稱ApplicationContext 為應用上下文

ApplicationContext 面向 Spring 框架的開發者(屬於上層封裝元件,專門供開發者使用)

IoC 容器三種建立方式
  • ClassPathXmlApplication:從類路徑下的XML配置檔案中載入上下文定義,把應用上下文定義檔案當做類資源
  • FileSystemXmlApplicationContext:讀取檔案系統下的XML配置檔案並載入上下文定義
  • XmlWebApplicationContext:讀取Web應用下的XML配置檔案並載入上下文定義
裝配 Bean

裝配 Bean 就是在 IoC 容器中建立 Bean( IoC,控制反轉)以及確定 Bean 與 Bean 之間的依賴關係(DI,依賴注入)

Spring 支援三種裝配 Bean 的方式

  • 基於 XML 配置
  • 基於註解
  • 基於 Java 類配置
構造器注入 Bean

Spring IoC 容器構造器注入 Bean 使用 元素,使 Spring IoC 容器在例項化 Bean 時可以不呼叫預設構造器,而是呼叫有參構造器

裝配單例模式 Bean

Spring IoC 容器支援通過 元素的 屬性來裝配呼叫靜態方法例項化的 Bean

Bean 的作用域

在 Spring IoC 容器中,所有的 Bean 預設都是單例,當 IoC 容器裝配一個 Bean 時通過呼叫容器的 getBean ( )方法,總是返回 Bean 的同一個例項( Bean 的預設作用域為單例模式,singleton)

Bean 的初始化和銷燬

Spring通過在 元素中配置 init-method 和 destroy-method 屬性為 Bean 定義初始化和銷燬操作

  • init-method 屬性:指定在初始化 Bean 時要呼叫的方法
  • destroy-method 屬性:指定在 Bean 從容器移除之前要呼叫的方法

如果宣告的很多 Bean 都擁有相同的初始化方法名和銷燬方法名,可以使用 根元素的 default-init-method 和 default-destory-method 屬性

  • default-init-method 屬性:為應用上下文中所有的 Bean 設定一個共同的初始化方法
  • default-destory-method 屬性:為應用上下文中所有的 Bean 設定一個共同的銷燬方法
方法注入 Bean

Spring IoC 容器的 Bean 方法注入是利用 Bean 屬性的 set 方法來配置屬性的值,以實現 setter 方式的注入(Bean 方法注入使用 子元素配置)

內部注入 Bean

內部 Bean 的概念類似於 Java 的內部類,即內部 Bean 是定義在其他 Bean 內部的 Bean(內部注入 Bean 包括構造器注入和方法注入兩種方式)

內部 Bean 的特點是不能被複用(內部 Bean 僅適用於一次注入,而且不能被其他 Bean 所引用)

屬性名稱空間

元素

屬性名稱空間

元素是 Spring IoC 容器提供的另一種 Bean 屬性的裝配方式,該方式用於簡化屬性的配置,其作用與 元素相同

<!-- 未使用 p 元素-->
<bean id = “user”class=“com.dtinone.beans.User”>
    <property name=“name” value =“張三”/>
    <property name=“age”    value = “29”  /> 
</bean>

<!-- 使用 p 元素 -->
<bean id = “user”class=“com.dtinone.beans.User”
    p:name = “張三”
    p:age    = “29”  
/> 
裝配集合 Bean

使用 Spring 除了配置基本型別和引用型別屬性,還支援集合屬性的配置

Spring提供了 4 種類型的集合屬性元素:

裝配空值

除了為 Bean 的屬性或構造器引數裝配基本型別或引用型別外,Spring IoC 容器還支援裝配一個空值 NULL

  • 裝配空值主要應用於某些特殊情況下,Bean 會為它的屬性預設設定一個非空值,而裝配時又想不希望使用預設設定值,那麼就可以顯式地為該屬性裝配一個空值 NULL
<property name=“propertyName”><null/></property>
簡化裝配 Bean

Spring 提供兩種方式,可以幫助我們簡化 XML 配置方式裝配 Bean,這兩種方式分別是自動裝配和自動檢測

自動裝配

用於減少甚至消除配置 元素和 元素,讓 Spring 自動識別如何裝配 Bean 的依賴關係

自動裝配需要設定 的 autowire 屬性,其屬性值為自動裝配的型別

注意:每一種自動裝配型別各有優缺點,需要根據情況使用

預設自動裝配 Bean

如果需要為 Spring 應用上下文中的每一個 Bean 配置相同的自動裝配 autowire 屬性,那麼就可以在根元素 上增加一個 default-autowire 屬性

  • 預設情況下,default-autowire 屬性被設定為 no,表示所有 Bean 都不使用自動裝配
  • 對某個 Bean 選擇了自動裝配型別,仍然可以對該 Bean 的某些屬性進行顯式裝配,Spring IoC 容器會根據顯式裝配和自動裝配的優先順序選擇裝配策略

預設自動裝配 < 自動裝配 < 手動裝配

註解裝配 Bean

使用註解自動裝配與在 XML 配置中使用 autowire 屬性自動裝配並沒有太大差別(Spring IoC容器預設禁用註解裝配 Bean)

  • @Autowired 註解:可以用於標註 setter 方法,Spring 就會嘗試對該方法執行 byType 自動裝配;還可以用於標註需要自動裝配 Bean 引用的任意方法;還可以用於標註構造器,當建立 Bean 時,即使在XML 檔案中沒有使用 元素配置Bean,該構造器也需要進行自動裝配;還可以用於直接標註屬性,則可以刪除 setter 方法(@Autowire 註解甚至不受限於private關鍵字,仍然可以被自動裝配)
  • @Resource 註解:與 @Autowired 完全相同,唯一區別是預設安裝 byName 裝配 Bean,失敗則按照 byType 裝配 Bean
  • @Qualifier 註解:如果 Spring 有多個適合自動裝配的Bean,@Autowired 註解由於無法選擇哪一個 Bean 才是真正需要的,這時 Spring 將自動裝配失敗並丟擲異常,這種情況下可以使用 @Qualifier 註解來明確指定需要自動裝配的Bean
  • @Scope 註解:可以用於設定 Bean 的作用域
  • @Value 註解:可以用於屬性、方法和構造器,作用是設定 Bean 的基本型別屬性值
  • @PostConstructor 註解:可以用於設定 Bean 的初始化方法
  • @PreDestroy 註解:可以用於設定 Bean 的銷燬方法
自動檢測

Spring IoC 容器支援自動檢測 Bean 和 定義 Bean,在不使用 元素的情況下,Spring 應用中的大多數甚至所有的 Bean 都能夠實現定義和裝配

裝配基於 Java 類的配置

在Spring IoC 容器裝配 Bean 的一種新方式是基於 Java 類的配置(通過 @Configuration 註解和基於方法的 @Bean 註解實現)

  • @Bean 註解:指明方法的例項化,配置和初始化一個物件是通過 Spring 的 IoC 容器來管理的(對於使用以 XML 配置 Spring 的 元素,@Bean 註解和 元素作用相同)
  • @Configuration註解:指明該類主要是作為一個bean的來源定義。此外,@Configurationd 定義的類允許在同一個類中使用 @Bean 定義的方法來定義依賴的bean

舉例:

@configuration public class AppConfig  {
	public MyService myService( )  {
	       return new MyServiceImpl( );
	}	 
}

等價於