1. 程式人生 > >Spring核心元件詳解

Spring核心元件詳解

Bean元件

Bean元件在org.springframework.beans包下,這個包下的所有類主要解決了三件事:Bean的建立,Bean的定義,Bean的解析,對Spring的使用者來說,唯一要關心的是Bean的建立,其他兩個由Spring在內部自己完成

  • Spirng Bean的建立是典型的工廠模式,它的頂級介面是BeanFactory,下面是這個工廠的繼承關係:
    在這裡插入圖片描述
    BeanFactory有三個子類,ListableBeanFactory, HierarchicalBeanFactory和AutowireCapableBeanFactory,但是最終的預設實現類是DefaultListableBeanFactory,實現了所有介面。
  • 每個介面有自己對應的使用場景,是為了區分在Spring內部物件的傳遞和轉化過程中,對物件的資料所做的限制,例如 ListableBeanFactory 介面表示這些 Bean 是可列表的,而 HierarchicalBeanFactory 表示的這些 Bean 是有繼承關係的,也就是每個 Bean 有可能有父 Bean。AutowireCapableBeanFactory 介面定義 Bean 的自動裝配規則。這三個個介面共同定義了 Bean 的集合、Bean 之間的關係、以及 Bean 行為。
  • Bean的定義主要有BeanDefinition描述,如下圖描述了這些類的層次關係
    在這裡插入圖片描述
    Bean的定義就是完整的描述了在Spring配置檔案中自己定義的節點中所有的資訊,包括各種子節點。當Spring成功解析定義的一個節點後,在Spring內部就會轉化為BeanDefinion物件,以後所有操作都是對這個物件完成的。
  • Bean的解析過程非常複雜,功能被分的很細,因為這裡需要被拓展的地方很多,必須保證有足夠的靈活性,以應對可能的變化。Bean的解析主要是對Spring配置檔案的解析。這個解析通過下圖中的類完成:
    在這裡插入圖片描述
    當然還有對tag的解析沒有列出來

Context元件

  • Context 在 Spring 的 org.springframework.context 包下,通過上篇文章已經瞭解了Context中Spring中的作用,它實際是給Spring提供一個執行時的環境,用以儲存各個物件的狀態。

  • ApplicationContext是Context的頂級父類,它除了能標識一個頂級應用環境的基本資訊外,還繼承了5個介面,這5個介面主要是擴充套件了Context物件的功能。下面是Context的類結構圖:
    在這裡插入圖片描述

  • 繼承了BeanFactory介面,說明了Spring容器中執行的主體是Bean,另外繼承了ResoureLoader介面,使得Application可以訪問到任何外部資源,這將在Core中詳細說明。

  • Application的子類主要包含兩個方面:
    1.ConfigurableApplication表示該Context是可修改的,也就是在構建Context中使用者可以動態新增或修改已有的配置資訊,他下面又有多個子類,其中最經常使用的是可更新的Context,即AbstractRefreshableApplicationContext類。
    2.WebApplicationContext:是為web環境準備的Context,它可以直接訪問到ServletContext,通常情況下,這個介面使用的少

    再往下分就是按照構建 Context 的檔案型別,接著就是訪問 Context 的方式。這樣一級一級構成了完整的 Context 等級層次。

  • 總體來說Application必須要完成一下幾件事:

    • 標識一個應用環境

    • 利用BeanFactory建立Bean

    • 儲存物件關係

    • 捕獲各種事件

      Context 作為 Spring 的 IOC 容器,基本上整合了 Spring 的大部分功能,或者說是大部分功能的基礎。

Core元件

  • Core作為Spring的核心元件,包含了很多關鍵類,其中一個重要組成部分就是定義了資源的訪問方式。這種把所有資源定義成一個介面的方式值得在以後的設計中拿來學習。下面是Resource的類結構圖:
    在這裡插入圖片描述
    從上圖可以看出Resource封裝各種可能的資源型別,也就是對資源使用者遮蔽了檔案型別的不同,對資源提供者來說,Resource繼承了InputStreamSource介面,這個介面有個getInputStream方法,返回的是InputStream類。這樣所有的資源都可以通過InputStream這個類來獲取,所以也遮蔽了資源的提供者。同時通過ResourceLoader來統一資源的載入者,遮蔽了所有資源載入者的差異,他的預設實現是DefaultResorceLoader。

  • 下面看下Context和Resource是如何建立關係的?首先看下他們的類關係圖:
    在這裡插入圖片描述
    從上圖可以看出,Context把所有的資源載入工作交給了ResourecePatternResolver,它相當於一個接頭人,它把所有的資源的載入,解析和資源的定義整合在一起便於其他元件的使用。Core中還有很多類似的方式。