本節書摘來自異步社群《spring實戰(第4版)》一書中的第1章,第1.2節,作者: 【美】craig walls(沃爾斯)著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視
在基于spring的應用中,你的應用對象生存于spring容器(container)中。如圖1.4所示,spring容器負責建立對象,裝配它們,配置它們并管理它們的整個生命周期,從生存到死亡(在這裡,可能就是new到finalize())。

圖1.4 在spring應用中,對象由spring容器建立和裝配,并存在容器之中
在下一章,你将了解如何配置spring,進而讓它知道該建立、配置群組裝哪些對象。但首先,最重要的是了解容納對象的容器。了解容器将有助于了解對象是如何被管理的。
容器是spring架構的核心。spring容器使用di管理構成應用的元件,它會建立互相協作的元件之間的關聯。毫無疑問,這些對象更簡單幹淨,更易于了解,更易于重用并且更易于進行單元測試。
spring容器并不是隻有一個。spring自帶了多個容器實作,可以歸為兩種不同的類型。bean工廠(由org.springframework.beans.factory.beanfactory接口定義)是最簡單的容器,提供基本的di支援。應用上下文(由org.springframework.context.applicationcontext接口定義)基于beanfactory建構,并提供應用架構級别的服務,例如從屬性檔案解析文本資訊以及釋出應用事件給感興趣的事件監聽者。
雖然我們可以在bean工廠和應用上下文之間任選一種,但bean工廠對大多數應用來說往往太低級了,是以,應用上下文要比bean工廠更受歡迎。我們會把精力集中在應用上下文的使用上,不再浪費時間讨論bean工廠。
1.2.1 使用應用上下文
spring自帶了多種類型的應用上下文。下面羅列的幾個是你最有可能遇到的。
annotationconfigapplicationcontext:從一個或多個基于java的配置類中加載spring應用上下文。
annotationconfigwebapplicationcontext:從一個或多個基于java的配置類中加載spring web應用上下文。
classpathxmlapplicationcontext:從類路徑下的一個或多個xml配置檔案中加載上下文定義,把應用上下文的定義檔案作為類資源。
filesystemxmlapplicationcontext:從檔案系統下的一個或多個xml配置檔案中加載上下文定義。
xmlwebapplicationcontext:從web應用下的一個或多個xml配置檔案中加載上下文定義。
當在第8章讨論基于web的spring應用時,我們會對annotationconfigweb-applicationcontext和xmlwebapplicationcontext進行更詳細的讨論。現在我們先簡單地使用filesystemxmlapplicationcontext從檔案系統中加載應用上下文或者使用classpathxmlapplicationcontext從類路徑中加載應用上下文。
無論是從檔案系統中裝載應用上下文還是從類路徑下裝載應用上下文,将bean加載到bean工廠的過程都是相似的。例如,如下代碼展示了如何加載一個filesystemxmlapplicationcontext:
類似地,你可以使用classpathxmlapplicationcontext從應用的類路徑下加載應用上下文:
使用filesystemxmlapplicationcontext和使用classpathxmlapp-licationcontext的差別在于:filesystemxmlapplicationcontext在指定的檔案系統路徑下查找knight.xml檔案;而classpathxmlapplicationcontext是在所有的類路徑(包含jar檔案)下查找 knight.xml檔案。
如果你想從java配置中加載應用上下文,那麼可以使用annotationconfig-applicationcontext:
在這裡沒有指定加載spring應用上下文所需的xml檔案,annotationconfig-applicationcontext通過一個配置類加載bean。
應用上下文準備就緒之後,我們就可以調用上下文的getbean()方法從spring容器中擷取bean。
現在你應該基本了解了如何建立spring容器,讓我們對容器中bean的生命周期做更進一步的探究。
1.2.2 bean的生命周期
在傳統的java應用中,bean的生命周期很簡單。使用java關鍵字new進行bean執行個體化,然後該bean就可以使用了。一旦該bean不再被使用,則由java自動進行垃圾回收。
相比之下,spring容器中的bean的生命周期就顯得相對複雜多了。正确了解spring bean的生命周期非常重要,因為你或許要利用spring提供的擴充點來自定義bean的建立過程。圖1.5展示了bean裝載到spring應用上下文中的一個典型的生命周期過程。
圖1.5 bean在spring容器中從建立到銷毀經曆了
若幹階段,每一階段都可以針對spring如何管理bean進行個性化定制
正如你所見,在bean準備就緒之前,bean工廠執行了若幹啟動步驟。我們對圖1.5進行較長的描述:
1.spring對bean進行執行個體化;
2.spring将值和bean的引用注入到bean對應的屬性中;
3.如果bean實作了beannameaware接口,spring将bean的id傳遞給setbean-name()方法;
4.如果bean實作了beanfactoryaware接口,spring将調用setbeanfactory()方法,将beanfactory容器執行個體傳入;
5.如果bean實作了applicationcontextaware接口,spring将調用setapplicationcontext()方法,将bean所在的應用上下文的引用傳入進來;
6.如果bean實作了beanpostprocessor接口,spring将調用它們的post-processbeforeinitialization()方法;
7.如果bean實作了initializingbean接口,spring将調用它們的after-propertiesset()方法。類似地,如果bean使用init-method聲明了初始化方法,該方法也會被調用;
8.如果bean實作了beanpostprocessor接口,spring将調用它們的post-processafterinitialization()方法;
9.此時,bean已經準備就緒,可以被應用程式使用了,它們将一直駐留在應用上下文中,直到該應用上下文被銷毀;
10.如果bean實作了disposablebean接口,spring将調用它的destroy()接口方法。同樣,如果bean使用destroy-method聲明了銷毀方法,該方法也會被調用。
現在你已經了解了如何建立和加載一個spring容器。但是一個空的容器并沒有太大的價值,在你把東西放進去之前,它裡面什麼都沒有。為了從spring的di中受益,我們必須将應用對象裝配進spring容器中。我們将在第2章對bean裝配進行更詳細的探讨。
我們現在首先浏覽一下spring的體系結構,了解一下spring架構的基本組成部分和最新版本的spring所釋出的新特性。