spring源碼分析系列4:ApplicationContext研究

ApplicationContext接口

首先看一下一個最基本的上下文應該是什麼樣子
在這裏插入圖片描述
ApplicationContext接口的註釋裏寫的很清楚:
一個基本applicationContext應該提供:spring

  • 訪問Bean的能力
  • 提供加載資源的能力
  • 發佈事件的能力
  • 解析消息、支持國際化的能力

AbstractApplicationContext承上啓下

在這裏插入圖片描述

ConfigurableApplicationContext接口:

大部分上下文都實現了此接口. 此接口除了繼承了ApplicaitnContext接口的能力外. 還具備可配置上下文與生命週期管理功能.
其中最重要的是定義了refresh()方法. refresh()功能是加載配置.segmentfault

AbstractApplicationContext抽象類:

大部分上下文都繼承了此類.AbstractApplicationContext能夠說啓到承上啓下的做用.app

從繼承圖咱們看, AbstractApplicationContext實現了大部分的接口方法.
其中refresh()方法的實現.爲ApplicationContext提供了加載配置的能力.工具

加載的什麼配置呢?
其實:所謂加載的配置大部分都是加載Bean

ApplicationContext與BeanFactory關係

上節分析了BeanFactory存儲BeanDefinition與Bean. 而且BeanFactory的createBean()方法能夠將BeanDefinition建立成Bean.spa

要想從BeanFactory中獲取Bean,就得先有BeanDefinition. 有了BeanDefinition,還要觸發BeanDefinition到Bean的建立.code

這裏就產生了兩個問題:xml

  • BeanDefinition從哪裏來?
  • 建立過程在哪裏觸發的?

ApplicationContext扮演的角色也就顯而易見了.blog

ApplicationContext初始化的核心工做是將散落在各個目錄下的各類配置形式的Bean定義,蒐集起來解析成BeanDefinition併入庫到BeanFactory.而後觸發BeanDefinition建立成Bean,存到BeanFactory中繼承

至此: 整個spring啓動的脈絡就也清晰了. 兩大塊:Bean定義的蒐集+Bean的建立.接口

`
[開發人員]--標註-->[Bean定義] --蒐集--> [BeanDefinition] --建立-->[Bean]
`

ApplicationContext重要工做

開發人員經常使用的標註Bean定義的方式有.

  • xml文件標註Bean定義
  • 註解標註Bean定義

ApplicationContext將這些Bean定義轉爲BeanDefinition並非那麼容易.

第一步蒐集:須要把散落的Bean定義的載體找到.蒐集起來.(注意,ApplicationContext蒐集Bean定義的過程其實也是經過調用工具來執行的)

  • XML對應的有XmlBeanDefinitionReader 蒐集器
  • 註解JavaConfig對應的有ClassPathBeanDefinitionScanner收集器

第二步解析.將XML或者JavaConfig中的標註了Bean定義的轉爲BeanDefinition

第三步:擴展點.BeanFactoryPostProcessor.實現了此接口的類能夠在BeanDefinition入庫到BeanFactory的這個階段中,修改BeanDefinition信息.這也是spring留下的擴展點。

BeanDefinitionRegistryPostProcessor與BeanFactoryPostProcessor與BeanPostProcessor區別:

  • BeanFactoryPostProcessor:能夠修改BeanDefinition。發生在BeanDefinition入庫到BeanFactory階段.
  • BeanDefinitionRegistryPostProcessor繼承與BeanFactoryPostProcessor:單從名字上看,咱們能夠看出,這個PostProcessor跟BeanDefinition註冊有關。他發生的階段比BeanFactoryPostProcessor更早,他用來註冊BeanDefinition用。實現了此接口的能夠看做一個BeanDefinition掃描註冊器。
  • BeanPostProcessor: 發生在BeanDefinition建立Bean階段。

總結:

BeanDefinition是物料
Bean是成品
BeanFactory 存儲物料,存儲成品.
ApplicationContext初始化: 蒐集物料,入庫到BeanFactory, 並觸發非懶加載成品的建立.
歡迎你們關注個人公衆號【源碼行動】,最新我的理解及時奉送。
在這裏插入圖片描述

相關文章
相關標籤/搜索