spring源碼:核心組件(li)

1、AOP實現web

  Spring代理對象的產生:代理的目的是調用目標方法時咱們能夠轉而執行InvocationHandler類的invoke方法,因此如何在InvocationHandler上作文章就是Spring實現Aop的關鍵所在。Spring的代理類正是繼承了Factory Bean的ProxyFactoryBean,ProxyFactoryBean之因此特別就在它可讓你自定義對象的建立方法。固然代理對象要經過Proxy類來動態生成。下面是Spring建立的代理對象的時序圖:Spring建立了代理對象後,當你調用目標對象上的方法時,將都會被代理到InvocationHandler類的invoke方法中執行。在這裏JdkDynamicAopProxy類實現了InvocationHandler接口。spring

  Spring是調用攔截器,Spring調用攔截器的時序圖以下:編程

2、IOC容器的初始化過程緩存

  Spring提供了一個BeanFactory的基本實現,XmlBeanFactory一樣的經過使用模板模式來獲得對IOC容器的抽象-AbstractBeanFactory,DefaultListableBeanFactory這些抽象類爲其提供模板服務。其中經過resource 接口來抽象bean定義數據,對Xml定義文件的解析經過委託給XmlBeanDefinitionReader來完成。簡單的演示IOC容器的建立過程:數據結構

ClassPathResource res = new ClassPathResource("beans.xml"); 
DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); 
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(res);  

這些代碼演示瞭如下幾個步驟:架構

  1. 建立IOC配置文件的抽象資源
  2. 建立一個BeanFactory
  3. 把讀取配置信息的BeanDefinitionReader,這裏是XmlBeanDefinitionReader配置給BeanFactory
  4. 從定義好的資源位置讀入配置信息,具體的解析過程由XmlBeanDefinitionReader來完成,這樣完成整個載入bean定義的過程。咱們的IoC容器就創建起來了。

實際上,Spring的IoC容器初始化包括:Bean定義資源文件的定位、載入和註冊3個基本過程。 工具

  1. Bean定義資源文件的定位: Bean定義資源文件定位由ResourceLoader經過統一的Resource接口來完成,Resource接口將各類形式的Bean定義資源文件封裝成統一的、IoC容器可進行載入操做的對象。 經過ResourceLoader來完成資源文件位置的定位,DefaultResourceLoader是默認的實現,同時上下文自己就給出了ResourceLoader的實現,能夠從類路徑,文件系統, URL等方式來定爲資源位置。若是是XmlBeanFactory做爲IOC容器,那麼須要爲它指定bean定義的資源,也就是說bean定義文件時經過抽象成Resource來被IOC容器處理的。
  2. Bean定義資源文件的載入: Bean定義資源文件載入的過程是將Bean定義資源文件中配置的Bean轉換成IoC容器中所管理Bean的數據結構形式。Spring IoC中管理 的Bean的數據結構是BeanDefinition,BeanDefinition是POJO對象在IoC容器中的抽象。容器經過BeanDefinitionReader來完成定義信息的解析和Bean信息的註冊,每每使用的是XmlBeanDefinitionReader來解析bean的xml定義文件,實際的處理過程是委託給BeanDefinitionParserDelegate來完成的,從而獲得bean的定義信息,這些信息在Spring中使用BeanDefinition對象來表示 。這個名字可讓咱們想到loadBeanDefinition,RegisterBeanDefinition這些相關的方法,他們都是爲處理BeanDefinitin服務的。
  3. Bean定義的註冊:IoC容器解析獲得BeanDefinition之後,須要把它在IOC容器中註冊,這由IOC實現 BeanDefinitionRegistry接口來實現。註冊過程就是在IOC容器內部維護的一個HashMap來保存獲得的 BeanDefinition的過程。這個HashMap是IoC容器持有bean信息的場所,之後對bean的操做都是圍繞這個HashMap來實現的。

3、Spring IOC容器的設計post

兩條主線:第一條主線:從接口BeanFactory到HierarchicalBeanFactory,再到ConfigurableBeanFactory,是一條主要的BeanFactory設計路線。spa

  1. BeanFactory接口定義了基本的IoC容器的規範。基本定義了獲取bean和獲取判斷bean全局範圍類型等。
  2. HierarchicalBeanFactory,提供了getParentBeanFactory,使BeanFactory具有了雙親IoCring容器管理能力,和containsLocalBean(String name)兩個方法。
  3. ConfigurableBeanFactory,主要定義了一些對BeanFactory的配置功能。

  第二條主線:第二條接口設計主線是,以ApplicationContext應用上下文接口爲核心的接口設計,這裏涉及的主要接口設計有,從BeanFactory到ListableBeanFactory,再到ApplicationContext,再到ConfigurableApplicationContext或WebApplicationContext。設計

  1. ListableBeanfactory接口繼承了 BeanFactory 的同時,提供了列舉 Bean 的功能,他可以列舉當前 BeanFactory 加載的全部 Bean :列舉全部 Bean 的名字或者知足某種類型的 Bean 的名字,根據類型返回全部 Bean 對象 , 等。可是它沒法獲取上層 BeanFactory 加載的單例 Bean 。
  2. HierarchicalBeanFactory 比較簡單,它主要是提供父 BeanFactory 的功能,經過它可以獲取當前 BeanFactory 的父工廠( PS: 若在 A 工廠啓動並加載 Bean 以前, B 工廠先啓動並加載了,那 B 就是 A 的父工廠),這樣就能讓當前的 BeanFactory 加載父工廠加載的 Bean 了,彌補了 ListableBeanfactory 欠缺的功能。
  3. ConfigurableBeanFactory 就是在 HierarchicalBeanFactory 的基礎上增長了可配置的功能,包括註冊別名、註冊單例等,設置 Classloader 、是否緩存 Bean Metadata 、設置 TypeConverter 、 BeanPostProcessor 、配置 Bean 依賴等。 PS:ConfigurableBeanFactory 還繼承了 SingletonBeanRegistry 定義了一個註冊singleton bean的容器,用來定義爲用來共享的 bean 實例的註冊表。此接口能夠被BeanFactory的實現實現,用來造成一個統一管理singleton bean的風格。
  4. AutowireCapableBeanFactory ,主要是提供自動 Bean 自動綁定 ( 或者說自動裝配 ) 功能。例如根據自動裝配策略 new 一個 bean ,爲已有的 bean 裝配屬性依賴;還有建立 bean 以後的回調功能,爲 bean 設置 name 、 bean factory 、 bean post processor 等;將 bean post processor 應用到 bean 的初始化,等等。
  5. MessageSource用來支持國際化。
  6. ResourceLoader接口用於實現不一樣的Resource加載策略,即將不一樣Resource實例的建立交給ResourceLoader來計算。在ResourceLoader接口中,主要定義了一個方法:getResource(),它經過提供的資源location參數獲取Resource實例。
  7. ApplicationEventPublisher接口做爲事件發佈者,而且ApplicationContext實現了這個接口,擔當起了事件發佈者這一角色。

4、Spring整體架構

 

  Spring總共有十幾個組件,可是真正核心的組件只有三個:Core、Context和Beans。它們構建起了整個Spring的骨骼架構。沒有它們就不可能有AOP、Web等上層的特性功能。

  1. Spring就是面向Bean的編程(BOP,Bean Oriented Programming),Bean在Spring 中才是真正的主角。Bean在Spring中做用就像Object對OOP的意義同樣,沒有對象的概念就像沒有面向對象編程,Spring中沒有Bean也就沒有Spring存在的意義。Spring解決了一個很是關鍵的問題是把對象之間的依賴關係轉而用配置文件來管理,也就是依賴注入機制。而這個注入關係在一個叫Ioc容器中管理,那Ioc容器中存放的就是被Bean包裹的對象。Spring正是經過把對象包裝在 Bean中而達到對這些對象管理以及一些列額外操做的目的。
  2. Context就是一個Bean關係的集合,這個關係集合又叫Ioc容器。若是把Bean比做一場演出中的演員的話,那Context就是這場演出的舞臺背景。
  3. Core就是發現、創建和維護每 個Bean之間的關係所須要的一些列的工具,從這個角度看來,Core這個組件叫Util更能理解一些。

5、核心組件

  Bean組件在Spring的org.springframework.beans包下。這個包下的全部類主要解決了三件事:Bean的定義、Bean 的建立以及對Bean的解析。

  如上圖所示:Bean的建立時典型的工廠模式,他的頂級接口是BeanFactory,下圖是這個工廠的繼承層次關係。

  如上圖所示:Bean的定義主要有BeanDefinition描述,以下圖說明了這些類的層次關係。Bean的定義就是完整的描述了在Spring的配置文件中你定義的節點中全部的信息,包括各類子節點。當Spring成功解析完定義的一個節點後,在Spring的內部就被轉化成BeanDefinition對象。

  如上圖所示:Bean的解析過程很是複雜,功能被分的很細,由於這裏須要被擴展的地方不少,必須保證有足夠的靈活性,以應對可能的變化。Bean的解析主要就是對Spring配置文件的解析。這個解析過程主要經過下圖中的類完成。

 

  Context組件:Context在Spring的org.springframework.context包下。ApplicationContext是Context的頂級父類,他除了能標識一個應用環境的基本信息外,他還繼承了五個接口,這五個接口主要是擴展了Context的功能。下面是Context的類結構圖,從上圖中能夠看出ApplicationContext繼承了BeanFactory,這也說明了Spring容器中運行的主體對象是Bean。 

ApplicationContext的子類主要包含兩個方面:

  1. ConfigurableApplicationContext表示該Context是可修改的,也就是在構建Context中用戶能夠動態添加或修改已有的配置信息,它下面又有多個子類,其中最常用的是可更新的Context,即 AbstractRefreshableApplicationContext類。
  2. WebApplicationContext顧名思義,就是爲web準備的Context他能夠直接訪問到ServletContext,一般狀況下,這個接口使用的少。

再往下分就是按照構建Context的文件類型,接着就是訪問Context的方式。這樣一級一級構成了完整的Context等級層次。整體來講ApplicationContext必需要完成如下幾件事:

  1. 標識一個應用環境
  2. 利用BeanFactory建立Bean對象
  3. 保存對象關係表
  4. 可以捕獲各類事件

Context做爲Spring的Ioc容器,基本上整合了Spring的大部分功能,或者說是大部分功能的基礎。

 

  Core組件,Core組件做爲Spring的核心組件,他其中包含了不少的關鍵類,其中一個重要組成部分就是定義了資源的訪問方式。下圖是Resource相關的類結構圖。 

  Resource接口封裝了各類可能的資源類型,也就是對使用者來講屏蔽了文件類型的不一樣。對資源的提供者來講,如何把資源包裝起來交給其餘人用這也是一個問題,Resource 接口繼承了InputStreamSource接口,這個接口中有個getInputStream方法,返回的是InputStream類。這樣全部的資源都被能夠經過InputStream這個類來獲取,因此也屏蔽了資源的提供者。ResourceLoader接口屏蔽了全部的資源加載者的差別,只須要實現這個接口就能夠加載全部的資源, 他的默認實現是DefaultResourceLoader。

  Context和Resource的關係:Context是把資源的加載、解析和描述工做委託給了ResourcePatternResolver類來完成,他至關於一個接頭人,他把資源的加載、解析和資源的定義整合在一塊兒便於其餘組件使用。

6、

相關文章
相關標籤/搜索