1. 程式人生 > >Spring體系總結(一):BeanDefinition

Spring體系總結(一):BeanDefinition

1、BeanDefinition簡介

  1. BeanDefiniton是一個介面,繼承自AttributeAccessor和BeanMetadataElement兩個介面,這兩個介面主要是為了“訪問物件相關屬性”和“獲取元資料相關資訊”。BeanDefinition的主要定義物件就是Bean,對bean在整個Spring 容器框架中的基本資料結構進行定義,方便BeanFactory等獲取。
  2. Spring框架,眾多的Bean的定義分為兩種形式,一種通過XML,或者通過註解。當我們程式碼定義完整的Bean後,Ioc啟動過程中,就得對相關的xml schema進行解析或相關注解下類進行掃描,從將我們配置的Bean轉換為Spring內部表示的資料結構。

2、BeanDefinition註冊過程

  1. 由於BeanDefinition的資料來源是我們定義的xml相關的Bean,所以自然BeanDefinition的註冊過程就是對於xml的解析過程以及對相關元素賦值的過程,在Spring框架中解析<Bean>元素過程中不是建立和例項化Bean物件,而是通過建立BeanDefinition物件,並將<Bean>元素的相關配置資訊填充到BeanDefinition中作為記錄,當依賴注入時才使用這些記錄的相關資訊通過BeanFactory進行例項化具體的Bean物件(就是先下個定義,需要時在使用),眾多的BeanDefinition可通過BeanDefinitionHolder集中管理。
  2. Spring提供了主要兩種bean Definition解析器,都繼承自AbstractBeanDefinitionReader
  • GroovyBeanDefinitionReader

Groovy是一門基於JVM的動態語言,和Spring結合擁有強大的功能,主要可以用在Bean的動態載入,無需重啟系統即可實現Bean的載入,特別是Spring cloud zuul中Zuul的規則引擎允許通過任何JVM語言來編寫規則和過濾器, 支援基於Java和Groovy的構建。

  • PropertiesBeanDefinitionReader

一種支援簡單的屬性檔案的解析器,對於Map/Properties定義的格式屬性檔案或者ResourceBundle進行註冊,主要是在DefaultListableBeanFactory進行運用。

  • XmlBeanDefinitionReader

一種支援Xml檔案的解析器,主要是在DefaultListableBeanFactory和GenericApplicationContext這兩個BeanFactory中使用,以及獲取Xml中定義的相關Bean的資訊。

【PropertiesBeanDefinitionReader和XmlBeanDefinitionReander中的都存在方法registerBeanDefinition方法,這個方法核心作用都是將定義的bean註冊到factory】

3、Bean工廠獲取BeanDefinition

  • BeanDefinitionRegistry(向登錄檔中註冊 BeanDefinition 例項,完成 註冊的過程。)
  • DefaultListableBeanFactory是一個實際意義上的可以獨立使用的IOC容器,其是繼承介面BeanFactory和BeanDefinitionRegistry兩個核心介面,其主要應用就是註冊所有的definition或者獲取相應的definition。
  • GenericApplicationContext和DefaultListableBeanFactory類似也是繼承了兩個頂級介面BeanFactory和BeanDefinitionRegistry,同時還集成了ResourceLoader介面進行資源獲取

4、涉及到設計模式

程式碼中AbstractBeanDefinitionReader的三個整合類中通過xml、動態載入獲取、引數配置檔案等方式來獲取解析Bean,這裡運用了外觀模式,通過一個介面,將內部複雜的實現隱藏,對外客戶端暴露簡單的介面,實現瞭解耦。