DefaultListableBeanFactory是一個成熟的bean工廠,spring中各種ioc容器的實現都是基於它,所以很有必要對它開始研究。
魯迅曾說過,要認識一個類,首先得搞清楚它的繼承體系,和它的初始化過程
繼承體系
初看這個圖可能會被嚇到,無從入手,但我作爲一個菜鳥在經過學習後發現spring的設計真的很清晰。
下面我會這些接口做一些簡單的介紹,作爲菜鳥,理解可能有不對的地方
- BeanFactory : 裏面定義的主要行爲是getBean()方法的幾個重載(通過名稱一個一個的查找)
- ListableBeanFactory: 它對BeanFactory進行了拓展,不在是一個一個的查詢bean,他能提供容器類所有bean的列舉,其定義的行爲,也集中在這方面,如根據type,annotation來獲取所有滿足的bean。在這個接口定義裏面,我們就能接觸到一個重要的概念,那就是BeanDefinition,能實現列舉的基礎就在於,容器會先讀取配置的元數據,封裝成BeanDefinition
- HierachicalBeanFactory: 它的行爲很簡單,獲取父工廠,這表明它是在說明它的實現類會具備分層的能力,對於在BeanFactory中定義的行爲,若得不到結果,會嘗試去它的父工廠中嘗試。
- SingletonBeanRegistry:spring很有意思,他把複雜的功能做了清晰的拆分,這個接口是在定義一個註冊機,什麼是註冊機勒?可以把它理解爲一個Map,並提供一組對這個map的操作,這個接口就提供了一個單例註冊的功能。我們通過BeanFactory的getBean時候,它會先到這個註冊機中去拿。
- ConfigurableBeanFactory:spring對類的命名非常有規律,如這個Configureable開頭,表示提供配置功能,那麼自然會提供一些set行爲,這個接口提供的配置項比較多,如類加載器,屬性編輯器等,這有必要花時間重新開一篇介紹。
- AutowireCapableBeanFactory: 它拓展了BeanFactory,提供了自動裝配的功能
- AliasRegitstry:類似前面提到的SingletonBeanRegistry,它也是一個註冊機,註冊name對應的別名
- BeanDefinitionRegistry:它也是一個註冊機,註冊name對應的BeanDefinition,BeanDefinition是bean初始化的原料,它是重要,它是對一個bean的抽象,這也是一個很妙的設計,就像mybatis對statement的抽象,但是這裏不展開討論
- FactoryBeanRegistrySupport:對DefaultSingletonBeanRegistry的拓展,在spring中有一種特殊的bean,它就是FactoryBean,他可以看作是一個工廠,對某些類提供特定的初始化過程。當我們定義了一個它的實現類,通過工廠去取的時候,返回的是這個factoryBean的getBean返回的實例,而不是factroyBean本身,假如想獲取它本身,需要加上前綴&
待續。。。