spring源碼分析系列3:BeanFactory核心容器的研究

目錄

@(spring源碼分析系列3:核心容器的研究)
在講容器之前,再明確一下知識點。

  • BeanDefinition是Bean在容器的描述。BeanDefinition與Bean不是一個東西。
  • Bean是根據BeanDefinition創建出來的。也即是我們所說的對象。

BeanDefinition物料需要有地方存儲,Bean成品需要有地方存。今天我們講講倉庫。

BeanFactory家族

在這里插入圖片描述
此圖是默認容器DefaultListableBeanFactory的繼承,實現關系圖.我們從右向左來分析下.

  1. BeanFactory接口:
    容器頂級接口,提供了容器最基本的能力,包括獲取bean,是否包含bean,是否單例,獲取bean類型,Bean的別名等方法。
  2. ListableBeanFactory接口:
    BeanFactory的子接口;具有批量獲取Bean的能力
  3. HierarchicalBeanFactory接口:具有訪問父容器的能力。有層次的BeanFactory。
  4. AutowireCapableBeanFactory接口:繼承BeanFactory,擴展了自動裝配能力。這個接口更多的作用是用于于與其他框架集成,把不在spring容器中的Bean加入到Spring容器生命周期管理中來。此接口很少用
  5. ConfigurableBeanFactory:定義了BeanFactory的配置。繼承HierarchicalBeanFactory和SingletonBeanRegistry接口。實現了此接口的容器,具有層次,單例BeanDefinition注冊功能。
  6. ConfigurableListableBeanFactory:
    大融合接口,除了具有上述接口的能外,還具有:類加載器,類型轉化,屬性編輯器,BeanPostProcessor,作用域,bean定義,處理bean依賴關系, bean銷毀等功能。

  7. SingletonBeanRegistry接口: 具有Bean的操作能力.注冊,查詢,獲取Bean數量等能力. 注意此處的Bean是實例.區別于BeanDefinition.

  8. SimpleAliasRegistry:Bean的別名操作類,實現了AliasRegistry.具有存儲Bean別名,注冊Bean別名,獲取Bean別名的功能.aliasMap屬性存儲Bean別名

  9. DefaultSingletonBeanRegistry:除了繼承了SimpleAliasRegistry的功能外. 最重要的是實現了SingletonBeanRegistry接口.具有存儲Bean實例,注冊Bean,獲取Bean的能力.我們定義的被Spring管理的Class類的實例對象,以及實例的之間的相互依賴關系都是存儲在此類中.默認常用的容器DefaultListableBeanFactory的Bean的相關能力.就是通過間接繼承此類來實現的.
    /** Disposable bean instances: bean name --> disposable instance */
    private final Map<String, Object> disposableBeans = new LinkedHashMap<String, Object>();

    /** Map between containing bean names: bean name --> Set of bean names that the bean contains */
    private final Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap<String, Set<String>>(16);

    /** Map between dependent bean names: bean name --> Set of dependent bean names */
    private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<String, Set<String>>(64);

    /** Map between depending bean names: bean name --> Set of bean names for the bean's dependencies */
    private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<String, Set<String>>(64)
  1. FactoryBeanRegistrySupport: 提供多工廠Bean的支持.FactoryBean通過其名字我也可以看出是生產Bean的Bean.
  2. AbstractBeanFactory抽象類: 承上啟下.從圖中我們看出. AbstractBeanFactory.通過繼承關系,繼承FactoryBeanRegistrySupport各種能力.而且實現了右邊部分接口.已然是比較完備的Bean容器了.AbstractBeanFactory還通過模板模式定義了獲取Bean的算法骨架,
  3. AbstractAutowireCapableBeanFactory: .具有大部分的能力. 實現了AbstractBeanFactory定義的模板方法.其中doCreateBean方法邏輯是把一個BeanDefinition變成Bean的過程.這個方法非常重要.通常我們使用類創建對象.直接new出來. spring把BeanDefinition到Bean的過程模板化,留下了很多擴展點. 留給使用者可以在不同的時刻自定義BeanDefition創建Bean的過程.
  4. DefaultListableBeanFactory常用的默認容器實現,也是spring最常使用的容器類.看左邊DefaultListableBeanFactory實現了BeanDefinitionRegistry接口. 這說明什么?說明DefaultListableBeanFactory具有存儲BeanDefinition,操作BeanDefinition的能力.DefaultListableBeanFactory通過繼承關系也具有了Bean的存儲操作功能.

小結:

  1. BeanFactory體系,接口分明,完美的體現了接口分離原則。
  2. BeanFactory體系中有兩種存儲,一種是BeanDefinition的存儲,另一個是Bean的存儲.
  3. DefaultListableBeanFactory作為最常用的容器類.不但具有BeanDefinition的存儲操作功能,而且通過繼承具有Bean的存儲操作功能.DefaultListableBeanFactory把存儲的BeanDefinition通過一定算法創建Bean并存儲起來.

BeanDefinition,BeanFactory,Bean三者關系

通過上面的對各個接口,類的認識.我們再來看看三者的關系.

我們向BeanFactory容器中注入一個BeanDefinition。BeanFactory幫我們存儲起來.當我們想要得到一個Bean時.BeanFactory 幫我們把BeanDefinition創建Bean.并緩存起來.這個創建過程是可參與的.

  • BeanFactory保存了BeanDefiniton與Bean.
  • BeanFactory具有使用BeanDefinition創建Bean的功能
  • BeanFactory允許使用者可以干預BeanDefinition生成Bean的功能.

BeanFactory中的擴展點

設計原則之開閉原則說的特別好:說一個軟件實體應該通過擴展來實現變化.
很多優秀的框架都有類似的擴展點設計,列如:

  • Tomcat中的Filter
  • Tomcat中的pipline-valve
  • springmvc中的Interceptor

BeanFactory中從BeanDefinition到Bean并不是一下子就完成的.這有一個過程.spring正是在這個過程中留下擴展點.來實現BeanDefinition到Bean的過程中的各種自定義變化.

從上面我們得知:AbstractAutowireCapableBeanFactory中有個doCreateBean()正是BeanDefinition到Bean的創建方法.接下來我們看看這個方法.有哪些擴展點:

  1. xxxAware接口:使Bean可以獲得xxx. 列如實現了BeanFactoryAware接口的類,可以在該Bean被加載的過程中獲取加載該Bean的BeanFactory
  2. BeanPostProcessor:BeanPostProcessor接口定義的兩個方法,分別在bean的初始化方法(InitializingBean接口,或者init-method定義)執行的前后執行
  3. InitializingBean接口: 實現了InitializingBean接口的類,執行afterPropertiesSet
  4. 自定義的init-method方法:

總結:

BeanFactory是物料與成品倉庫,并配生產線,把BeanDefinition生產成Bean 。BeanFactory留下很多擴展點, 方便開發人員可以參與BeanDefinition到Bean的創建過程.

歡迎大家關注我的公眾號【源碼行動】,最新個人理解及時奉送。
在這里插入圖片描述

posted @ 2019-10-09 13:20 三人行{必有我師} 閱讀(...) 評論(...) 編輯 收藏
七乐彩2011年走势图南方双彩