前言:
本章涵蓋了反向控制(IoC)原理的Spring架構實作。IoC也稱為依賴注入(DI)。
一、簡介Spring IoC容器和bean:
IoC我們常說是控制反轉,IoC也稱為依賴注入(DI)。它是一個過程,對象定義它們的依賴關系,也就是他們工作的其他對象
,隻有通過構造函數參數,工廠方法的參數,或者在從工廠方法構造或傳回後在對象執行個體上設定的屬性。然後,容器 在建立bean時
注入這些依賴項。這個過程基本上是反向的,是以命名控制反轉(IoC),它通過使用直接構造類來控制其依賴關系的執行個體化或位置
,在
org.springframework.beans
和
org.springframework.context
包是Spring架構的IoC容器的基礎。該
BeanFactory
接
口提供了能夠管理任何類型的對象的進階配置機制。
ApplicationContext
是一個子界面
BeanFactory
。它更容易與Spring的
AOP功能內建; 消息資源處理(用于國際化),事件釋出; 以及應用層特定的上下文,例如
WebApplicationContext
用于Web應用
程式。簡而言之,它
BeanFactory
提供了配置架構和基本功能,并
ApplicationContext
增加了更多的企業特定功能。這
ApplicationContext
是一個完整的超集
BeanFactory
,并且在本章中專門用于Spring的IoC容器的描述。有關使用
BeanFactory
而不是
ApplicationContext,
參考 官網第7.16節“BeanFactory”的更多資訊。
在Spring中,構成應用程式主幹并由Spring IoC 容器管理的對象稱為bean。bean是由Spring IoC容器執行個體化,組裝和以其他方
式管理的對象。否則,bean隻是應用程式中的許多對象之一。Bean和 它們之間的依賴關系反映在容器使用的配置中繼資料中。
容器概述:
該接口
org.springframework.context.ApplicationContext
代表Spring IoC容器,并負責執行個體化,配置群組裝上述bean
。容器通過讀取配置中繼資料擷取有關執行個體化,配置群組合的對象的說明。配置中繼資料用XML,Java注釋或Java代碼表示。它允許您
表達組成應用程式的對象以及這些對象之間豐富的互相依賴關系。
ApplicationContext
接口的幾個實作方式與Spring一起提供。在獨立應用程式中,建立一個
ClassPathXmlApplicationContext
或多個執行個體是常見的
FileSystemXmlApplicationContext
。雖然XML是用于定義配置
中繼資料的傳統格式,但您可以通過提供少量XML配置來聲明性地啟用對這些附加中繼資料格式的支援,來訓示容器将Java注釋或代
碼用作中繼資料格式。
在大多數應用場景中,顯式使用者代碼不需要執行個體化一個或多個Spring IoC容器的執行個體。例如,在Web應用程式場景中,應用程式文
件中簡單的八(或更多)樣闆Web描述符XML行
web.xml
通常就足夠了
(參見官網第7.15.4節“Web應用程式的友善的ApplicationContext執行個體化”)。如果您正在使用 Spring Tool Suite Eclipse驅動的開發
環境,則可以通過滑鼠點選或擊鍵輕松建立該樣闆設定。
下圖是Spring如何工作的進階視圖。您的應用程式類與配置中繼資料相結合,以便在
ApplicationContext
建立和初始化後,您将具
有完全配置和可執行的系統或應用程式。
如圖:Spring IoC容器
二、配置中繼資料
如上圖所示,Spring IoC容器消耗一種配置中繼資料的形式 ; 此配置中繼資料表示應用程式開發人員如何告訴Spring容器來執行個體化,配置群組合應用程式中的對象。
配置中繼資料傳統上以簡單直覺的XML格式提供,這是本章大部分用于傳達Spring IoC容器的關鍵概念和功能。
基于XML的中繼資料 不是 唯一允許的配置中繼資料形式。Spring IoC容器本身與實際寫入此配置中繼資料的格式 完全 分離。這些天,很多開發人員為他們的Spring應用程式選擇 基于Java的配置 。
有關使用Spring容器的其他形式的中繼資料的資訊,請參閱:
- 基于注釋的配置:Spring 2.5引入了支援基于注釋的配置中繼資料。
- 基于Java的配置:從Spring 3.0開始,Spring JavaConfig項目提供的許多功能成為核心Spring Framework的一部分。是以,您可以使用Java而不是XML檔案來定義應用程式類外部的bean。要使用這些新功能,請參閱
,@Configuration
,@Bean
和@Import
注釋。@DependsOn
pring配置由容器必須管理的至少一個和通常多個bean定義組成。基于XML的配置中繼資料将這些Bean配置為
<bean/>elements inside a top-level
<beans/>
元素中的元素。Java配置通常
@Bean
在
@Configuration
類中使用注釋方法。
這些bean定義對應于構成應用程式的實際對象。通常,您定義服務層對象,資料通路對象(DAO),呈現對象(如Struts
Action
執行個體),基礎架構對象(如Hibernate
SessionFactories
,JMS
Queues
等)。通常,在容器中不配置細粒度的域對象,因為通常由DAO和業務邏輯負責建立和加載域對象。但是,您可以使用Spring與AspectJ的內建來配置在IoC容器的控制之外建立的對象。請參閱使用AspectJ對Spring進行依賴注入域對象。
以下示例顯示了基于XML的配置中繼資料的基本結構:
<?xml version =“1.0”encoding =“UTF-8”?>
<beans xmlns = “http://www.springframework.org/schema/beans”
xmlns:xsi = “http://www.w3.org / 2001 / XMLSchema-instance“
xsi:schemaLocation = ”http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd“ >
<bean id = “......” 級 = “...” >
<! -合作者和配置這個bean去這裡- >
</bean>
<bean ID = “...” 級 = “...“ >
<! - 這個bean的協作者和配置去這裡 - >
</ bean>
<! - 更多的bean定義到這裡 - >
</ beans>
該
id
屬性是用于辨別單個bean定義的字元串。該
class
屬性定義bean的類型,并使用完全限定的類名。id屬性的值是指協作對象。用于引用協作對象的XML在此示例中未顯示; 有關詳細資訊,請參閱 依賴關系。