Spring IOC概論

一、概念

Spring通過一個配置文件描述Bean及Bean之間的依賴關(guān)系。利用Java語言的反射功能實例化Bean并建立Bean之間的關(guān)系。Spring的IoC容器在完成這些底層工作的基礎(chǔ)上,還提供了Bean實例緩存、生命周期管理、Bean實例代碼、事件發(fā)布、資源裝載等高級服務(wù)。

IoC(Inversion of Control)
“控制反轉(zhuǎn)”,創(chuàng)建對象的權(quán)利,由程序員反轉(zhuǎn)給了Spring容器。用來管理對象的實例化和初始化,以及對象從創(chuàng)建到銷毀的整個生命周期。這些對象統(tǒng)稱為Spring Bean,即Java對象,與new出來的對象一樣。

  • 誰控制誰
    IoC 容器控制了對象。
  • 控制什么
    主要是外部資源獲取。
  • 為何反轉(zhuǎn)
    由容器查找及注入依賴對象,對象只是被動的接受依賴對象。
  • 哪些方面反轉(zhuǎn)
    依賴對象的獲取。

傳統(tǒng)創(chuàng)建對象的過程,如圖:


傳統(tǒng)創(chuàng)建對象.png

IOC/DI容器創(chuàng)建對象:


IOC容器創(chuàng)建對象.png

二、Spring容器高層視圖

Spring啟動時讀取應(yīng)用程序提供的Bean配置信息,并在Spring容器中生成一份相應(yīng)的Bean配置注冊表,然后根據(jù)這張注冊表實例化Bean,裝配好Bean之間的依賴關(guān)系,為上層應(yīng)用提供準(zhǔn)備就緒的運行環(huán)境。其中Bean緩存池為HashMap實現(xiàn)。


Spring 容器高層視圖.png

三、IOC容器實現(xiàn)

IoC的實現(xiàn),必須依賴DI,因為IoC只是負(fù)責(zé)對象的創(chuàng)建,而對象創(chuàng)建過程中需要將對象與對象的依賴進(jìn)行實現(xiàn)。此時使用到的就是DI(Dependency Injection,依賴注入,它必須依賴于IoC)

Spring 通過讀取 XML 或 Java 注解中的信息來獲取哪些對象需要實例化。

Spring 提供 2 種不同類型的 IoC 容器,即 BeanFactory 和 ApplicationContext 容器。

BeanFactory(簡述)

BeanFactory是Spring框架的基礎(chǔ)設(shè)施,面向Spring本身。
BeanFactory繼承體系


BeanFactory體系結(jié)構(gòu)圖.png
  1. BeanDefinitionRegistry 注冊表
    Spring配置文件中每一個節(jié)點元素在Spring容器里都通過一個BeanDefinition對象表示,它描述了Bean的配置信息。而BeanDefinitionRegistry接口提供了向容器手工注冊BeanDefinition對象的方法。
  2. BeanFactory頂層接口
    位于類結(jié)構(gòu)樹頂端,它最主要的方法就是getBean(String beanName),該方法從容器中返回特定名稱的Bean,BeanFactory的功能通過其他的接口得到不斷的擴(kuò)展。
  3. ListableBeanFactory
    該接口定義了訪問容器中Bean基本信息的若干方法,如查看Bean的個數(shù)、獲取某一類型Bean的配置名、查看容器中是否包括某一Bean等方法。
  4. HierarchicalBeanFactory父子級聯(lián)
    父子級聯(lián)IOC容器的接口,子容器可通過接口方法訪問父容器;
    通過HierarchicalBeanFactory接口,Spring的IOC容器可建立父子層次關(guān)聯(lián)的容器體系,子容器可訪問父容器中的Bean,但父容器不能訪問子容器的Bean。Spring使用父子容器實現(xiàn)了很多功能,比如在Spring MVC中,展現(xiàn)層Bean位于一個子容器中,而業(yè)務(wù)層和持久層的Bean位于父容器中。這樣,展現(xiàn)層Bean就可引用業(yè)務(wù)層和持久層的Bean,而業(yè)務(wù)層和持久層的Bean則看不到展現(xiàn)層的Bean。
  5. ConfigurableBeanFactory
    一個重要接口,增強了IOC容器的可定制性,它定義了設(shè)置類裝載器、屬性編輯器、容器初始化后置處理器等方法。
  6. AutowireCapableBeanFactory自動裝配
    定義了將容器中的Bean按某種規(guī)則(如按名字匹配、按類型匹配等)進(jìn)行自動裝配的方法。
  7. SingletonBeanRegistry運行期間注冊單例Bean
    定義了允許在運行期間向容器注冊單實例Bean的方法;
    對于單實例(singleton)的Bean來說,BeanFactory會緩存Bean實例,所以第二次使用getBean()獲取Bean時將直接從IOC容器的緩存中獲取Bean是來。Spring在DefaultSingletonBeanRegistry類中提供了一個用于緩存單實例Bean的緩存器,它是一個用HashMap實現(xiàn)的緩存器,單實例的Bean以beanName為鍵保存在這個HashMap中。
  8. 依賴日志框架
    在初始化BeanFactory時,必須為其提供一種日志框架,如Log4J,即在類路徑下提供Log4J配置文件,這樣啟動Spring容器才不會報錯。

ApplicationContext(簡述)

ApplicationContext面向使用Spring框架的開發(fā)者,幾乎所有的應(yīng)用場合我們都直接使用ApplicationContext而非底層的BeanFactory。
ApplicationContext 由 BeanFactory 派 生 而 來 , 提 供 了 更 多 面 向 實 際 應(yīng) 用 的 功 能 。ApplicationContext 繼承了 HierarchicalBeanFactory和ListableBeanFactory 接口,在此基礎(chǔ)上,還通過多個其他的接口擴(kuò)展了BeanFactory 的功能


ApplicationContext架構(gòu)體系.png
  1. ClassPathXmlApplicationContext:默認(rèn)從類路徑加載配置文件。
  2. FileSystemXmlApplicationContext:默認(rèn)從文件系統(tǒng)中裝載配置文件。
  3. ApplicationEventPublisher:讓容器擁有發(fā)布應(yīng)用上下文事件的功能,包括容器啟動事件、關(guān)閉事件等。
  4. MessageSource:為應(yīng)用提供 i18n 國際化消息訪問的功能。
  5. ResourcePatternResolver : 所 有 ApplicationContext 實現(xiàn)類都實現(xiàn)了類似于PathMatchingResourcePatternResolver 的功能,可以通過帶前綴的 Ant 風(fēng)格的資源文件路徑裝載 Spring 的配置文件。
  6. LifeCycle:該接口是 Spring 2.0 加入的,該接口提供了 start()和 stop()兩個方法,主要用于控制異步處理過程。在具體使用時,該接口同時被 ApplicationContext 實現(xiàn)及具體Bean 實現(xiàn), ApplicationContext 會將 start/stop 的信息傳遞給容器中所有實現(xiàn)了該接口的 Bean,以達(dá)到管理和控制 JMX、任務(wù)調(diào)度等目的。
  7. ConfigurableApplicationContext 擴(kuò)展于 ApplicationContext,它新增加了兩個主要
    的方法: refresh()和 close(),讓 ApplicationContext 具有啟動、刷新和關(guān)閉應(yīng)用上下
    文的能力。在應(yīng)用上下文關(guān)閉的情況下調(diào)用 refresh()即可啟動應(yīng)用上下文,在已經(jīng)啟動的狀態(tài)下,調(diào)用 refresh()則清除緩存并重新裝載配置信息,而調(diào)用 close()則可關(guān)閉應(yīng)用上下文。

WebApplication體系結(jié)構(gòu)

WebApplicationContext是專門為Web應(yīng)用準(zhǔn)備的,它允許從相對于Web根目錄的路徑中裝載配置文件完成初始化工作。從WebApplicationContext中可獲得ServletContext的引用,整個Web應(yīng)用上下文對象將作為屬性放置到ServletContext中,以便Web應(yīng)用環(huán)境可訪問Spring應(yīng)用上下文。


WebApplicationContext.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容