Spring核心組件剖析
Spring核心組件
Spring的核心組件有很多,但構成其骨骼的,是Core,Context和Bean。
Bean
三者之中,Bean是核心中的核心。Bean實現了將對象通過配置文件的方式,由Spring來管理對象存儲空間,生命周期的分配。通過 依賴注入 的方式,可以實現將對象注入到指定的業務邏輯類中。這些 注入關系 ,由Ioc容器來管理。
因此,Spring的核心思想常常被稱作 BOP(Bean Oriented Programming) ,面向Bean編程。
Bean組件定義在Spring的 org.springframework.beans 包下,解決了以下幾個問題:
-
Bean的 定義
-
Bean的 創建
-
Bean的 解析
使用者只需要關注Bean的創建,其他兩個過程由Spring內部完成。
1.整體架構
Spring Bean的整體架構是典型的工廠模式,最上層的接口是 BeanFactory 。ListableBeanFactory、HierarchicalBeanFactory和AutowireCapableBean是其子類,目的是為了 區分Spring內部對象處理和轉化的數據限制 。
-
ListableBeanFactory : 表示這些Bean是可列表的
-
HierarchicalBeanFactory : 表示這些Bean有繼承關系
-
AutowireCapableBeanFactory : 定義Bean的自動裝配規則
這幾個接口分別定義了Bean的集合、Bean的關系和Bean的行為。
2.Bean定義
Bean的定義主要由BeanDefinition描述,層次關系如下:
Spring的配置文件中定義的 節點,成功解析后都會被轉化為BeanDefinition對象,之后所有的操作都會在BeanDefinition對象之上進行。
3.Bean解析
Bean解析的主要任務是:對Spring的配置文件進行解析,最后生成BeanDefinition對象。
解析過程非常復雜,包括配置文件里所有的tag。主要參與的類如下:
Context
Bean包裝的是一個個Object,Object中存儲著業務所需的數據。所以,如何給這些數據及之間的關系提供生存、運行環境(即 保存對象的狀態 ),就是Context要解決的問題。Context實際上就是Bean關系的集合,又稱之為 Ioc容器 。
ApplicationContext是Context最上層的接口,層次關系如下:
ApplicationContext能夠標識一個應用環境的 基本信息 。其上繼承了5個接口,用于拓展Context的功能,其中BeanFactory用于創建Bean,同時繼承了 ResourceLoader 接口,用于訪問任何外部資源。
ApplicationContext的子類,主要包括:
-
ConfigurableApplicationContext : 用戶 可動態配置 和 修改信息 的Context,其下AbstractRefreshableApplicationContext最為常用。
-
WebApplicationContext :
為Web應用準備的Context,可以直接訪問ServletContext。
總之,ApplicationContext必須完成的功能如下:
-
標識一個應用環境
-
利用BeanFactory創建Bean對象
-
保存 對象關系表
-
捕獲各種事件
作為Ioc容器,Context是Spring其他大部分功能的 基礎 。
Core
Spring 發現、建立和維護Bean之間關系的 一攬子工具 ,稱之為Core。實際上就是所需的Util。
Core的重要組成部分之一是 Resource 。
1. Resource整體層次
Resource主要定義了 資源的訪問方式 ,所有資源都抽象到了Resource接口中,層次關系如下:
-
資源包裝 。Resource向上繼承了 InputStreamSource 接口,所有的資源都通過InputStream來獲取,從而屏蔽了資源提供者。
-
資源加載 。Resource下的 ResourceLoader 接口,所有資源加載者統一實現該接口就能 加載所有的資源 ,例如之前的ApplicationContext。
2. 與Context建立關系
如圖,ApplicationContext通過 ResourcePatternResolver 接口與 ResourceLoader 進行交互,來進行資源的加載、解析和描述。ResourcePatternResolver將資源封裝整合,便于其他組件使用。
總結
本文主要總結了構成Spring骨骼框架的三大核心組件及其之間的聯系,以及對三者實現原理理解的一些心得體會。
來自:http://www.cnblogs.com/ACFLOOD/p/6022667.html