天天看點

Spring文檔 IOC容器

一、介紹Spring架構

  • Spring 子產品圖
Spring文檔 IOC容器
  • Maven的“材料清單”依賴

使用Maven時,可能會意外混合不同版本的Spring JAR。例如,您可能會發現第三方庫或另一個Spring項目會傳遞依賴于舊版本的Spring JARs。如果您忘記自己明确聲明直接依賴,可能會出現各種意外問題。

為了克服這些問題,Maven支援“材料清單(bill of materials)”(BOM)依賴的概念。您可以在dependencyManagement部分中導入spring-framework-bom,以確定所有Spring依賴(直接和傳遞)都是相同的版本

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-framework-bom</artifactId>
			<version>${spring.version}</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>
           

使用BOM的另外一個好處是,您不再需要在依賴于Spring Framework artifacts時指定<version>屬性:

<dependencies>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-web</artifactId>
	</dependency>
<dependencies>
           

二、Spring IoC容器和beans的介紹

本章涵蓋了Spring架構實作控制反轉(IoC)的原理。IoC又叫依賴注入(DI)。它描述了對象的定義和依賴的一個過程,也就是說,依賴的對象通過構造參數、工廠方法參數或者屬性注入,當對象執行個體化後依賴的對象才被建立,當建立bean後容器注入這些依賴對象。這個過程基本上是反向的,是以命名為控制反轉(IoC),它通過直接使用構造類來控制執行個體化,或者定義它們之間的依賴關系,或者類似于服務定位模式的一種機制。

簡單了解,就是将我們對對象的控制權(執行個體化對象),反轉給了第三方(IoC容器)去控制。

如果一個類A 的功能實作需要借助于類B,那麼就稱類B是類A的依賴,如果在類A的内部去執行個體化類B,那麼兩者之間會出現較高的耦合,一旦類B出現了問題,類A也需要進行改造,如果這樣的情況較多,每個類之間都有很多依賴,那麼就會出現牽一發而動全身的情況,程式會極難維護,并且很容易出現問題。要解決這個問題,就要把A類對B類的控制權抽離出來,交給一個第三方去做,把控制權反轉給第三方,就稱作控制反轉(IOC Inversion Of Control)。控制反轉是一種思想,是能夠解決問題的一種可能的結果,而依賴注入(Dependency Injection)就是其最典型的實作方法。由第三方(我們稱作IOC容器)來控制依賴,把他通過構造函數、屬性或者工廠模式等方法,注入到類A内,這樣就極大程度的對類A和類B進行了解耦。

參考連結:淺談控制反轉與依賴注入 - 胡小國的文章 - 知乎

org.springframework.beans

org.springframework.context

是Spring架構中IoC容器的基礎,

BeanFactory

接口提供一種進階的配置機制能夠管理任何類型的對象。

ApplicationContext

是 BeanFactory 的子接口。它能更容易內建Spring的AOP功能、消息資源處理(比如在國際化中使用)、事件釋出和特定的上下文應用層比如在網站應用中的WebApplicationContext。

Spring文檔 IOC容器

三、容器概述

org.springframework.context.ApplicationContext

接口代表了Spring Ioc容器,它負責執行個體化、配置、組裝之前的beans。容器通過讀取配置中繼資料擷取對象的執行個體化、配置群組裝的描述資訊。支援三種格式的配置中繼資料:

中繼資料:向Spring容器提供相關資訊,以便執行個體化Bean,并指定如何對這些Bean進行裝配。所提供的資訊稱為配置中繼資料(configuration metadata)。

Spring提供幾個開箱即用的 ApplicationContext 接口的實作類。在獨立應用程式中通常建立一個

ClassPathXmlApplicationContext

FileSystemXmlApplicationContext

執行個體對象。雖然XML是用于定義配置中繼資料的傳統格式,你也可以訓示容器使用Java注解或代碼作為中繼資料格式,但要通過提供少量XML配置來聲明啟用對這些附加中繼資料格式的支援。

下圖是Spring如何工作的進階展示。你應用中所有的類都由中繼資料組裝到一起是以當 ApplicationContext 建立和執行個體化後,你就有了一個完全可配置和可執行的系統或應用。

Spring文檔 IOC容器
1、配置中繼資料

配置中繼資料的三種格式:

  • 基于Java
  • 基于注解
  • 基于XML

以基于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="..." class="...">
		<!-- 在這裡寫 bean 的配置和相關引用 -->
	</bean>
	
	<bean id="..." class="...">
		<!-- 在這裡寫 bean 的配置和相關引用 -->
	</bean>
	
	<!-- 在這裡配置更多的bean -->
</beans>
           
2、使用容器
// create and configure beans
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

// retrieve configured instance
PetStoreService service = context.getBean("petStore", PetStoreService.class);

// use configured instance
List<String> userList = service.getUsernameList();