@TOC 在講容器以前,再明確一下知識點。java
BeanDefinition物料須要有地方存儲,Bean成品須要有地方存。今天咱們講講倉庫。算法
BeanFactory接口: 容器頂級接口,提供了容器最基本的能力,包括獲取bean,是否包含bean,是否單例,獲取bean類型,Bean的別名等方法。spring
ListableBeanFactory接口: BeanFactory的子接口;具備批量獲取Bean的能力緩存
HierarchicalBeanFactory接口:具備訪問父容器的能力。有層次的BeanFactory。mvc
AutowireCapableBeanFactory接口:繼承BeanFactory,擴展了自動裝配能力。這個接口更多的做用是用於於與其餘框架集成,把不在spring容器中的Bean加入到Spring容器生命週期管理中來。此接口不多用框架
ConfigurableBeanFactory:定義了BeanFactory的配置。繼承HierarchicalBeanFactory和SingletonBeanRegistry接口。實現了此接口的容器,具備層次,單例BeanDefinition註冊功能。編輯器
ConfigurableListableBeanFactory: 大融合接口,除了具備上述接口的能外,還具備:類加載器,類型轉化,屬性編輯器,BeanPostProcessor,做用域,bean定義,處理bean依賴關係, bean銷燬等功能。spa
SingletonBeanRegistry接口: 具備Bean的操做能力.註冊,查詢,獲取Bean數量等能力. 注意此處的Bean是實例.區別於BeanDefinition.設計
SimpleAliasRegistry:Bean的別名操做類,實現了AliasRegistry.具備存儲Bean別名,註冊Bean別名,獲取Bean別名的功能.aliasMap屬性存儲Bean別名3d
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)
複製代碼
小結:
經過上面的對各個接口,類的認識.咱們再來看看三者的關係.
咱們向BeanFactory容器中注入一個BeanDefinition。BeanFactory幫咱們存儲起來.當咱們想要獲得一個Bean時.BeanFactory 幫咱們把BeanDefinition建立Bean.並緩存起來.這個建立過程是可參與的.
設計原則之開閉原則說的特別好:說一個軟件實體應該經過擴展來實現變化. 不少優秀的框架都有相似的擴展點設計,列如:
BeanFactory中從BeanDefinition到Bean並非一會兒就完成的.這有一個過程.spring正是在這個過程當中留下擴展點.來實現BeanDefinition到Bean的過程當中的各類自定義變化.
從上面咱們得知:AbstractAutowireCapableBeanFactory中有個doCreateBean()正是BeanDefinition到Bean的建立方法.接下來咱們看看這個方法.有哪些擴展點:
BeanFactory是物料與成品倉庫,並配生產線,把BeanDefinition生產成Bean 。BeanFactory留下不少擴展點, 方便開發人員能夠參與BeanDefinition到Bean的建立過程.
歡迎你們關注個人公衆號【源碼行動】,最新我的理解及時奉送。