天天看點

Spring源碼閱覽——BeanFactory體系結構

Spring源碼閱覽——BeanFactory體系結構

BeanFactory:Spring的Bean容器最頂層的接口,定義了Ioc容器的基本規範。實作這個接口的Ioc容器都會持有一些BeanDefinition和一個唯一的字元串形式的名字。--《Spring之1:的BeanFactory和FactoryBean》

HierarchicalBeanFactory:HierarchicalBeanFactory繼承BeanFactory并擴充使其支援層級結構。getParentBeanFactory()方法或者父級BeanFactory,containsLocalBean(String name)方法檢視目前BeanFactory是否包含給定名字的Bean,不會遞歸想父級查找。--《Spring之2:HierarchicalBeanFactory接口》

ListableBeanFactory:同樣擴充BeanFactory使其支援疊代Ioc容器持有的Bean對象。注意如果ListableBeanFactory同時也是HierarchicalBeanFactory,那麼大多數情況下,隻疊代目前Ioc容器持有的Bean對象,不會在體系結構中想父級遞歸疊代。具體情況請看API說明。--《Spring之3:ListableBeanFactory》

ResourceLoader:Spring提供資源的根接口。在Spring Ioc中,資源被Resource引用,獲得Resource對象,說明獲得了資源的通路。Resource提供資源的抽象,具體資源可是從URL,classpath,file等地方獲得。

ResourcePatternResolver:ResourcePatternResolver是對ResourceLoader的擴充,其支援模式比對的資源。如:classpath*:表示比對路徑下所有的資源。

DefaultResourceLoader:ResourceLoader的預設實作,可以單獨使用,也可以通過擴充使其支援特殊的資源,如:FileSystemResourceLoader,ClassPathXmlApplicationContext等。

ApplicationEventPublisher:封裝事件釋出,通知事件監聽者此Application的事件。

MessageSource:處理Spring 中的消息,支援i18n和參數化消息。另外其子類ReloadableResourceBundleMessageSource支援不重新開機JVM重新整理消息。

EnvironmentCapable:實作此接口的容器将支援上下文環境。在Spring Ioc容器中,都是支援上下文環境的。

ApplicationContext:從上圖來看,ApplicationContext繼承了上面描述的所有接口,是以ApplicationContext是一個接口集合,提供所繼承接口的功能。另外,ApplicationContext在啟動後是隻讀的,但是如果ApplicationContext實作類支援reload,也可以重新整理這個ApplicationContext。

Lifecycle:對BeanFactory提供生命周期支援。另外其他任何對象都可以實作Lifecycle接口開支援開始/結束控制。注意Lifecycle接口隻支援頂層對象,其他的Lifecycle将被忽略。

DisposableBean:DisposableBean提供了在銷毀Ioc容器的時候釋放資源。

ConfigurableApplicationContext:提供對Ioc容器的配置的支援。包括設定父級容器,設定上下文環境,重新整理容器,注冊關閉容器鈎子等。

AbstractApplicationContext:AbstractApplicationContext是Ioc容器的抽象實作,這裡實作了大部分的功能:消息,事件,重新整理容器,生命周期等。AbstractApplicationContext采用模闆方法模式,把一部分實作推遲到子類。

AbstractRefreshableApplicationContext:提供多線程同時重新整理容器支援,每次重新整理都會産生一個内部BeanFactory(DefaultListableBeanFactory)。另外,子類要實作loadBeanDefinitions方法來正确加載Bean定義。

Aware:Aware是個标記接口,實作這個接口的對象提供通知Spring容器功能。具體個通知動作來子類中定義。

BeanNameAware:Aware的子接口,當設定BeanName的時候,建立通知。

InitializingBean:這個接口作用是當Bean對象的屬性都被設定完成或,可以立即做一些自定義的動作。令一個替代方案是設定init-method。

AbstractRefreshableConfigApplicationContext:提供對容器的一些特殊設定:setConfigLocation,setBeanName,setId等。

AbstractXmlApplicationContext:從XML讀取Bean定義的容器,這個容器實作了loadBeanDefinitions方法,從XML資源中獲得Bean定義。

FileSystemXmlApplicationContext:标準的從檔案系統讀XML的Bean定義容器。getResourceByPath方法傳回檔案系統資源。

說了這麼多的BeanFactory,還有一個重量級的沒有說:DefaultListableBeanFactory--《Spring之22:DefaultListableBeanFactory》

DefaultListableBeanFactory包含了Ioc容器的重要内容,很多容器都會用的它。如AbstractApplicationContext.refersh()方法就會銷毀内部的容器并重新建立一個DefaultListableBeanFactory作為起内部表示。DefaultListableBeanFactory則直接繼承它成為從XML讀取資源的Ioc容器。

在DefaultListableBeanFactory有一個ConcurrentHashMap儲存了Bean的定義。

 另外附上DefaultListableBeanFactory的層級結構圖:

Spring源碼閱覽——BeanFactory體系結構

  23.AbstractAutowireCapableBeanFactory:

  24.AbstractBeanFactory:除了BeanFactory這一支的接口,AbstractBeanFactory主要實作了AliasRegistry和SingletonBeanRegistry接口,這邊主要提供了這樣的三個功能: 别名管理,單例建立與注冊,工廠方法FactoryBean支援.

  24.FactoryBeanRegistrySupport:

  25.DefaultSingletonBeanRegistry:--《Spring之25:SingletonBeanRegistry&DefaultSingletonBeanRegistry》

  26.SingletonBeanRegistry:

  27.BeanDefinitionRegistry:--《Spring之27:BeanDefinitionRegistry》

  28.AliasRegistry、SimpleAliasRegistry:Spring Bean的别名管理--《Spring之28:AliasRegistry&SimpleAliasRegistry》

Spring源碼閱覽——BeanFactory體系結構

Ⅰ.BeanDefnition:BeanDefinition描述一個bean執行個體,這個bean執行個體包含了屬性值,構造函數的參數值,以及由具體實作提供額進一步資訊。--見《Spring之Ⅰ:BeanDefinition》