Spring框架現在已成爲服務端開發框架中的主流框架之一,是web開發者的利器。然而,真正讓人着迷的,仍是與其實現相關的 原理,設計模式以及許多工程化的思想。本文主要探討Spring的三大核心組件。web
Spring的核心組件有不少,但真正構成其骨骼的,是Core,Context和Bean。spring
三者之中,Bean是核心中的核心。Bean實現了將對象經過配置文件的方式,由Spring來管理對象存儲空間,生命週期的分配。經過依賴注入的方式,能夠實現將對象注入到指定的業務邏輯類中。這些注入關係,由Ioc容器來管理。編程
所以,Spring的核心思想經常被稱做BOP(Bean Oriented Programming),面向Bean編程。設計模式
Bean組件定義在Spring的org.springframework.beans包下,解決了如下幾個問題:架構
Bean的定義框架
Bean的建立工具
Bean的解析spa
使用者只須要關注Bean的建立,其餘兩個過程由Spring內部完成。設計
Spring Bean的總體架構是典型的工廠模式,最上層的接口是BeanFactory。ListableBeanFactory、HierarchicalBeanFactory和AutowireCapableBean是其子類,目的是爲了區分Spring內部對象處理和轉化的數據限制。對象
ListableBeanFactory: 表示這些Bean是可列表的
HierarchicalBeanFactory: 表示這些Bean有繼承關係
AutowireCapableBeanFactory: 定義Bean的自動裝配規則
這幾個接口分別定義了Bean的集合、Bean的關係和Bean的行爲。
Bean的定義主要由BeanDefinition描述,層次關係以下:
Spring的配置文件中定義的<bean/>節點,成功解析後都會被轉化爲BeanDefinition對象,以後全部的操做都會在BeanDefinition對象之上進行。
Bean解析的主要任務是:對Spring的配置文件進行解析,最後生成BeanDefinition對象。
解析過程很是複雜,包括配置文件裏全部的tag。主要參與的類以下:
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其餘大部分功能的基礎。
Spring 發現、創建和維護Bean之間關係的一攬子工具,稱之爲Core。實際上就是所需的Util。
Core的重要組成部分之一是Resource。
Resource主要定義了資源的訪問方式,全部資源都抽象到了Resource接口中,層次關係以下:
資源包裝。Resource向上繼承了InputStreamSource接口,全部的資源都經過InputStream來獲取,從而屏蔽了資源提供者。
資源加載。Resource下的ResourceLoader接口,全部資源加載者統一實現該接口就能加載全部的資源,例如以前的ApplicationContext。
如圖,ApplicationContext經過ResourcePatternResolver接口與ResourceLoader進行交互,來進行資源的加載、解析和描述。ResourcePatternResolver將資源封裝整合,便於其餘組件使用。
本文主要總結了構成Spring骨骼框架的三大核心組件及其之間的聯繫,以及對三者實現原理理解的一些心得體會。
做者: I'm coding
連接:ACFLOOD
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
若是您以爲本文對您有所幫助,就給俺點個贊吧!
參考書籍:《深刻分析Java Web技術內幕》(許令波)
圖片來源:《深刻分析Java Web技術內幕》(許令波)