在講容器以前,再明確一下知識點。java
- BeanDefinition是Bean在容器的描述。BeanDefinition與Bean不是一個東西。
- Bean是根據BeanDefinition建立出來的。也便是咱們所說的對象。
BeanDefinition物料須要有地方存儲,Bean成品須要有地方存。今天咱們講講倉庫。算法
BeanFactory家族
此圖是默認容器DefaultListableBeanFactory的繼承,實現關係圖.咱們從右向左來分析下.spring
- BeanFactory接口: 容器頂級接口,提供了容器最基本的能力,包括獲取bean,是否包含bean,是否單例,獲取bean類型,Bean的別名等方法。
- ListableBeanFactory接口:BeanFactory的子接口;具備批量獲取Bean的能力
- HierarchicalBeanFactory接口:具備訪問父容器的能力。有層次的BeanFactory。
- AutowireCapableBeanFactory接口:繼承BeanFactory,擴展了自動裝配能力。這個接口更多的做用是用於於與其餘框架集成,把不在spring容器中的Bean加入到Spring容器生命週期管理中來。此接口不多用
- ConfigurableBeanFactory:定義了BeanFactory的配置。繼承HierarchicalBeanFactory和SingletonBeanRegistry接口。實現了此接口的容器,具備層次,單例BeanDefinition註冊功能。
- ConfigurableListableBeanFactory:大融合接口,除了具備上述接口的能外,還具備:類加載器,類型轉化,屬性編輯器,BeanPostProcessor,做用域,bean定義,處理bean依賴關係, bean銷燬等功能。
- SingletonBeanRegistry接口: 具備Bean的操做能力.註冊,查詢,獲取Bean數量等能力. 注意此處的Bean是實例.區別於BeanDefinition.
- SimpleAliasRegistry:Bean的別名操做類,實現了AliasRegistry.具備存儲Bean別名,註冊Bean別名,獲取Bean別名的功能.aliasMap屬性存儲Bean別名
- 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)
- FactoryBeanRegistrySupport: 提供多工廠Bean的支持.FactoryBean經過其名字我也能夠看出是生產Bean的Bean.
- AbstractBeanFactory抽象類: 承上啓下.從圖中咱們看出. AbstractBeanFactory.經過繼承關係,繼承FactoryBeanRegistrySupport各類能力.並且實現了右邊部分接口.已然是比較完備的Bean容器了.AbstractBeanFactory還經過模板模式定義了獲取Bean的算法骨架,
- AbstractAutowireCapableBeanFactory: .具備大部分的能力. 實現了AbstractBeanFactory定義的模板方法.其中doCreateBean方法邏輯是把一個BeanDefinition變成Bean的過程.這個方法很是重要.一般咱們使用類建立對象.直接new出來. spring把BeanDefinition到Bean的過程模板化,留下了不少擴展點. 留給使用者能夠在不一樣的時刻自定義BeanDefition建立Bean的過程.
- DefaultListableBeanFactory經常使用的默認容器實現,也是spring最常使用的容器類.看左邊DefaultListableBeanFactory實現了BeanDefinitionRegistry接口. 這說明什麼?說明DefaultListableBeanFactory具備存儲BeanDefinition,操做BeanDefinition的能力.DefaultListableBeanFactory經過繼承關係也具備了Bean的存儲操做功能.
小結:緩存
- BeanFactory體系,接口分明,完美的體現了接口分離原則。
- BeanFactory體系中有兩種存儲,一種是BeanDefinition的存儲,另外一個是Bean的存儲.
- DefaultListableBeanFactory做爲最經常使用的容器類.不但具備BeanDefinition的存儲操做功能,並且經過繼承具備Bean的存儲操做功能.DefaultListableBeanFactory把存儲的BeanDefinition經過必定算法建立Bean並存儲起來.
BeanDefinition,BeanFactory,Bean三者關係
經過上面的對各個接口,類的認識.咱們再來看看三者的關係.mvc
咱們向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的過程當中的各類自定義變化.spa
從上面咱們得知:AbstractAutowireCapableBeanFactory中有個doCreateBean()正是BeanDefinition到Bean的建立方法.接下來咱們看看這個方法.有哪些擴展點:設計
- xxxAware接口:使Bean能夠得到xxx. 列如實現了BeanFactoryAware接口的類,能夠在該Bean被加載的過程當中獲取加載該Bean的BeanFactory
- BeanPostProcessor:BeanPostProcessor接口定義的兩個方法,分別在bean的初始化方法(InitializingBean接口,或者init-method定義)執行的先後執行
- InitializingBean接口: 實現了InitializingBean接口的類,執行afterPropertiesSet
- 自定義的init-method方法:
總結:
BeanFactory是物料與成品倉庫,並配生產線,把BeanDefinition生產成Bean 。BeanFactory留下不少擴展點, 方便開發人員能夠參與BeanDefinition到Bean的建立過程.code
歡迎你們關注個人公衆號【源碼行動】,最新我的理解及時奉送。