1. 程式人生 > >Spring框架:核心容器總結

Spring框架:核心容器總結

最近想要深入瞭解一下spring,所以今天先對spring框架做一個巨集觀的總結。

Spring框架:

這裡寫圖片描述

首先我們看到Spring框架被分成7部分:Core Container(核心容器),Data Access/Integration、WEB、AOP、Instrumentation、Messaging(訊息)和Test(測試),這篇部落格我們把注意點放到最核心的核心容器上來進行總結。

核心容器

核心容器包括了:Beans、Core、Context、SpEL

1. core和beans模組提供了整個框架最基礎的部分,包括了IoC(控制反轉)和Dependency Injection(依賴注入)。

2. Context建立在Core和Beans模組提供的基礎之上:他提供了框架式訪問物件的方式

3. core、beans、context構成了Spring的骨架

4. SpEL:提供了一種強大的用於在執行時操作物件的表示式語言


Spring的設計理念(參考ibm的developerWorks)


前邊提到了spring的三個核心元件,而Beans元件則是核心的核心,其實Spring的思想基礎就是面向Bean的程式設計(BOP,Bean Oriented Programming),我們來類比面向物件程式設計,Bean就的作用之於Spring就好像Object之於面向物件程式設計一樣重要,就好比所有的佈景都已經搭好,卻沒有演員。這就是Bean之於spring的意義。

為何一個小小的Bean的作用這麼的強大,這是由於spring的設計目標決定的。我們想一想,為什麼Spring如此的流行,我們使用Spring是用他管理物件之間的依賴關係(通過配置檔案),這就是經常聽到的依賴注入機制。這個注入的關係通過IoC容器進行管理。IoC容器中管理的就是一個個Bean包含的物件。IoC容器可以看成是一個Beans關係的集合

這種設計策略完全類似於 Java 實現的 OOP 設計理念,構建一個數據結構,然後根據這個資料結構設計它的生存環境,並賦給它生命週期,使他在一定規律下不停的運動,在不停運動的過程中完成與其他個體的互動。

如果說 Bean 是一場話劇的演員的話,那麼 Context 就是舞臺,而 Core 就是道具,它們三個是演話劇最基本的元素。我們知道 Bean 包裝的是一個 Object,而 Object 中存在資料,而給這些資料提供生存環境就是 Context 要解決的問題,對於 Context 而言,它要發現每個 Bean,以及 Bean 與Bean 之間的關係,建立和維護好這種關係。所以 Context 就是 Bean 關係的集合,這個關係集合又叫 IOC 容器,而一旦建立起這個容器,Spring就可以進行工作了。那麼 Core 是用來做什麼的呢?發現、建立和維護 Bean 之間的關係所需要的一系列的工具,它為 Bean 元件和 Context 元件提供了支援。


Bean元件

1. 解決的問題:Bean的定義、Bean的建立、對Bean的解析,對於使用者而言,我們只需要關注Bean的建立,其他兩個由Spring內部完成,對用於來說是透明的

2. Bean的建立用到了工廠模式:父類是BeanFactory,最終的實現類是DefaultListableBeanFactory

3. Bean的定義要有BeanDefinition描述:當配置檔案中的一個標籤被解析後就會在內部轉化成一個BeanDefinition物件。以後的操作都是對這個物件完成的
4.bean的解析:主要就是對Spring配置檔案的解析,頂級介面是BeanDefintionReader和BeanDefinitionDocumentReader

Context元件

這裡寫圖片描述

  1. 他給Spring提供了一個執行時的環境,用以儲存各個物件的狀態
  2. 他繼承了BeanFactory的介面,說明Spring容器的主題物件還是Bean
  3. 他還繼承了ResourceLoader介面,是ApplicationContext可以訪問到外部任何資源
  4. ApplicationContext必須要完成的事情:
    • 標識一個應用環境
    • 利用BeanFactory建立Bean物件
    • 儲存物件關係表
    • 能夠捕獲各種事件


Core元件

這裡寫圖片描述

  1. 定義了資源的訪問方式(這種把所有資源都抽象成一個介面的方式很值得在以後設計中拿來學習)
  2. 我們看到Resource介面封裝了各種可能的資源型別,對使用者來說遮蔽了檔案型別的不同。Resource介面繼承了InputStreamSource介面,這個介面有個GetInputStream方法,返回的是一個InputStream類。所有的資源都可以通過這一個介面來獲取,也遮蔽了資源的提供者。我們再看一下最下邊的實現類:ResourceLoader介面,所有的資源都通過他來載入,這樣就遮蔽了不同資源載入者的差異

下一篇,將總結這三者是如何協同工作的,that’s all!