《Spring實戰(第4版)》——1.2 容納你的Bean
本節書摘來自異步社區《Spring實戰(第4版)》一書中的第1章,第1.2節,作者: 【美】Craig Walls(沃爾斯)著,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看
1.2 容納你的Bean
在基於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所發布的新特性。
最後更新:2017-05-31 11:02:53