spring源碼分析系列2:Bean與BeanDefinition關係

接口表示一種能力,實現了一個接口,即擁有一種能力。

BeanDefinition與Bean的關係, 就比如類與對象的關係. 類在spring的數據結構就是BeanDefinition.根據BeanDefinition獲得的對象就是咱們須要的Bean.java

我認爲理解Bean與BeanDefinition是理解spring的整個架構的基礎與關鍵。我將從Bean與BeanDefinition開始慢慢撥開spring的內幕。spring

研究bean與BeanDefinition,我認爲能夠分爲兩部分來按部就班的解析。segmentfault

  • 一方面從定義入手:研究Bean/BeanDefinition在spring中的定義.
  • 另外一方面從動做(操做)入手:研究Bean/BeanDefinition的相關操做。

BeanDefinition

BeanDefinition是bean在spring中的描述,有了BeanDefinition咱們就能夠建立Bean,BeanDefinition是Bean在spring中的定義形態
接下來咱們看看BeanDefinition的相關接口與類.數據結構

定義

  • BeanDefinition接口頂級基礎接口,用來描述Bean,裏面存放Bean元數據,好比Bean類名、scope、屬性、構造函數參數列表、依賴的bean、是不是單例類、是不是懶加載等一些列信息。

向上
在這裏插入圖片描述架構

  • BeanMetadataElement接口:BeanDefinition元數據,返回該Bean的來源
  • AttributeAccessor接口:提供對BeanDefinition屬性操做能力,

向下
在這裏插入圖片描述app

  • AbstractBeanDefinition類:抽象類統一實現了BeanDefinition定義的一部分操做,能夠說是定義了BeanDefinition不少默認的屬性。 正是在AbstractBeanDefinition基礎上, Spring衍生出了一些列BeaDefinition。

    這裏咱們能夠關注下重寫的equals(),hashcode(), toString()方法框架

    此外initMethodName屬性,destroyMethodName 屬性, 這兩個屬性bean的生命週期有關,此處只提一句,後續講解。函數

接下來。咱們看看從AbstractBeanDefinition上衍生出來的幾個類spa

  • RootBeanDefinition:

表明一個xml,java Config來的BeanDefinition代理

  • ChildBeanDefinition:

可讓子BeanDefinition定義擁有從父母哪裏繼承配置的能力

  • GenericBeanDefinition:

spring2.5後註冊bean首選的是GenericBeanDefinition。GenericBeanDefinition容許動態的設置父bean.GenericBeanDefinition能夠做爲RootBeanDefinition與ChildBeanDefinition的替代品。

  • AnnotatedBeanDefinition接口

表示註解類型BeanDefinition。有兩個重要的屬性,AnnotationMetadata,MethodMetadata分別表示BeanDefinition的註解元信息和方法元信息
實現了此接口的BeanDefinition能夠獲取到註解元數據和方法元數據。

  • AnnotatedGenericBeanDefinition類:

表示@Configuration註解註釋的BeanDefinition類

  • ScannedGenericBeanDefinition類:

表示@Component、@Service、@Controller等註解註釋的Bean類

操做

動做也可分爲兩種:
一種是針對自身的操做: 自提提供給外部的能夠操做其自己的動做
另外一種是外部對BeanDefinition的操做

  • BeanDefinitionRegistry接口:具備增,查,刪BeanDefinition的能力。一次只能註冊一個BeanDefinition.

    實現類SimpleBeanDefinitionRegistry,DefaultListableBeanFactory,GenericApplicationContext等

通常實現類裏都都有一個
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap()來存儲BeanDefinition.
在這裏插入圖片描述

  • BeanDefinitionReader接口: 既可使用BeanDefinitionRegistry構造。也能夠經過loadBeanDefinitions把配置加載爲多個BeanDefinition並註冊到BeanDefinitionRegistry中。

能夠說是高效版本的BeanDefinitionRegistry.

實現類有
XmlBeanDefinitionReader從xml中讀取BeanDefinition;
PropertiesBeanDefinitionReader從Properties文件讀取BeanDefinition
  • AnnotatedBeanDefinitionReader類

對帶有註解的BeanDefinition進行註冊

  • ClassPathBeanDefinitionScanner類

能夠掃描到@Component @Repository @Service @Controller 的BeanDefinition註冊到容器中。

其餘形態

  • BeanDefinitionHolder: BeanDefinition包裝類。

Bean

Bean是咱們須要的對象,是咱們從spring內獲得的結果,也就是對象實例

定義

從定義層面看.Bean其實就是咱們須要的對象.

操做

咱們來看看Bean在spring有哪些操做相關的接口或類。

  • SingletonBeanRegistry接口:與BeanDefinition的註冊相應的。Bean的操做也有一個相似的接口來操做Bean.SingletonBeanRegistry接口提供了對Bean的註冊,獲取,存在性判斷等功能。
  • InitializingBean:對於實現 InitializingBean的Bean,它將執行 afterPropertiesSet(); 在全部的 bean 屬性被設置以後。
  • InstantiationStrategy:提供 Bean實例化的策略接口,
  • DisposableBean:對於 實現了DisposableBean的Bean ,它將運行 destroy()在 Spring 容器釋放該 bean 以後
  • FactoryBean: 生產Bean的Bean.

其餘形態

  • BeanWrapper:

對Bean的包裝.BeanWrapper能夠看做是一個從 BeanDefinition 到 Bean 過程當中間的產物,能夠稱爲」低級 bean「,在通常狀況下,咱們不會在實際項目中用到它。BeanWrapper 是 Spring 框架中重要的組件類,它就至關於一個代理類,Spring 委託 BeanWrapper 完成 Bean 屬性的填充工做。在 bean 實例被 InstantiatioonStrategy 建立出來後,Spring 容器會將 Bean 實例經過 BeanWrapper 包裹起來,是經過 BeanWrapper.setWrappedInstance() 完成的

總結:

BeanDefinition是物料,Bean是成品,理解BeanDefinition與Bean的關係是理解spring的基礎

下篇分享 物料倉庫,成品倉庫,體如今「存」的操做。
歡迎你們關注個人公衆號【源碼行動】,最新我的理解及時奉送。
在這裏插入圖片描述

相關文章
相關標籤/搜索