本文重點探究DefaultListableBeanFactory的繼承層次及每一個繼承層次的作用
DefaultListableBeanFactory的繼承層次
如上圖所示, DefaultListableBeanFactory間接依賴了很多類, 這些類都是干什么的, 在一個Spring管理周期內(nèi)起到什么作用是本文探究的重點, 本文也會在問末探究一下這樣設(shè)計的意圖.
簡述
- AliasRegistry: 定義對Alias的增刪改查
- SimpleAliasRegistry: 主要使用map作為Alias的緩存, 并對接口AliasRegistry進行實現(xiàn)
- SingletonBeanRegistry: 定義對單例的注冊及獲取
- BeanFactory: 定義獲取bean及bean的各種屬性
- DefaultSingletonBeanRegistry:實現(xiàn)接口SingletonBeanRegistry
- HierarchicalBeanFactory: 集成BeanFactory, 即在BeanFactory的定義功能的基礎(chǔ)上增加了對parentFactory的支持
- BeanDefinitionRegistry: 定義對BeanDefinition的各種增刪改查操作
- FactoryBeanRegistrySupport: 在DefaultSingletonBeanRegistry的基礎(chǔ)上增加了對FactoryBean的特殊處理功能
- ConfigurableBeanFactory: 提供配置Factory的各種方法
- ListableBeanFactory: 根據(jù)各種條件獲取Bean的配置清單
- AbstractBeanFactory: 綜合factoryBeanRegistrySupport和ConfigurableBeanFactory的功能
- AutowireCapableBeanFactory: 提供創(chuàng)建Bean, 自動注入, 初始化已經(jīng)應(yīng)用Bean的后處理器
- AbstractAutowireCapableBeanFactory:綜合AbstractBeanFactory并對接口AutowireCapableBeanFactory進行實現(xiàn)
- ConfigurableListableBeanFactory: BeanFactory配置清單, 指定忽略類型及接口等
- DefaultListableBeanFactory: 綜合上述所有功能, 主要是對BeanFactory注冊后的處理
具體
AliasRegistryLEVEL 1 -- Interface
- 提供了alias的增刪改功能的接口
SimpleAliasRegistryLEVEL2 -- Concreate Class
- 使用map存儲alias -> 規(guī)范名稱 的映射蔫骂,并實現(xiàn)了AliasRegistry接口
- 注意事項
- 注冊alias的時候有一個alias環(huán)校驗, 具體來說香罐,就是判斷name -> alias是不是存在, 注意由于有多重映射,所以需要遞歸判斷. 如: x -> y, 需要判斷是不是存在y -> x 或者是y -> z -> w -> x(所以需要遞歸校驗)
- 由于遞歸性質(zhì)的存在, 包括hasAlias, retrieveAlias都有一個遞歸性的校驗
- resolveAliases: 使用了StringResolver來處理alias和name
BeanDefinitionRegistry LEVEL2 -- interface)
- 在AliasRegistry的基礎(chǔ)上添加了BeanDefinition處理的相關(guān)接口
- 增: registerBeanDefinition
- 刪:removeBeanDefinition
- 查:containsBeanDefinition学辱,getBeanDefinition,getBeanDefinitionCount,getBeanDefinitionNames念颈,isBeanNameInUse
- 按照文檔的說明:BeanDefinitionRegistry是Spring bean factory 包中唯一一個封裝了注冊BeanDefinition的接口, 標(biāo)準(zhǔn)的BeanFactory只提供了對工廠實現(xiàn)對象的操作
SingletonBeanRegistryLEVEL2 -- Interface
- 提供了單例的注冊讀取等连霉, 為了給BeanFactory提供一個操作單例的同一方式
- 可能涉及到同步問題榴芳, 后文中結(jié)合實現(xiàn)具體分析
BeanFactoryLEVEL2 --- Interface
- 是一個頂級的SpringBean容器, 表示一種比較通用的概念跺撼, 而它的子類比如ListableBeanFactory或者都是用于特殊的目的
- Bean容器會根據(jù)一個Bean name返回一個獨立的實例(原型模式)或者一個共享實例(單例模式)窟感, 稱之為scope, 從Spring2.0之后歉井, 更多的scope被支持了柿祈, 如“reques”和“session”scope
- 和ListableBeanfactory相反, HierarchicalBeanFactory支持從父容器獲得Bean的操作酣难, 如果Bean沒有被當(dāng)前容器找到谍夭, 父容器會被請求黑滴。
- &+beanname會獲得該bean所在的BeanFactory對象憨募, 如&myJndiObject會獲得該bean所屬的beanFactory
- BeanFactory接口提供了一系列方法, 分類表示如下
- 查詢接口:精細化程度遞增
- getBean(class)
- getBean(name)
- getBean(class, params)
- getBean(name, params)
- getBean(name, objs) : 使用給定的objs創(chuàng)建bean
- 判斷
- isSingleton
- isProtoType
- isTypeMatch
- containsBean
- getAlias
- 查詢接口:精細化程度遞增
HierarchicalBeanFactoryLEVEL3 -- Interface
- 表示帶有層級關(guān)系的bean容器
- 帶有g(shù)etParentBeanFactory方法袁辈, ConfigurableBeanFactory中有對應(yīng)的setParentBeanFactory方法
- containsLocalBean表示當(dāng)前容器中是否存在給定bean name的容器
ListableBeanFactoryLEVEL3 -- Interface
1.根據(jù)文檔的解釋菜谣, 該接口能夠枚舉當(dāng)前bean容器的所有bean, 而不是根據(jù)bean name一個個的去查詢晚缩, 尤其適用于需要預(yù)先處理的bean容器(如基于xml的bean容器尾膊, 需要預(yù)先從文件中獲得bean的元數(shù)據(jù)信息,構(gòu)造參數(shù)等)
DefaultSingletonBeanRegistryLEVEL3 -- Interface
-
DefaultSingletonBeanRegistry提供如下功能
- 通用的單例Bean的注冊容器, 實現(xiàn)SingletonBeanRegistry接口
- 同時支持注冊DisposableBean, 同時支持注冊bean之間的依賴關(guān)系, 從而能強制實現(xiàn)一個shutdown order
-本類只要是作為BeanFactory實現(xiàn)類的基類, 抽離出singleton bean實例的一般操作 - 注意本類既不是bean的定義, 也不是bean實例創(chuàng)建的特殊流程, 這點跟AbstractBeanFactory和DefaultListableBeanFactory有很大的不同, 通常作為一個helper委托使用
-
一般流程
-
重要的成員
- singletonObjects: 存儲所有注冊的singleton實例
- singletonFactories: singleton實例工廠類
- earlySingletonObjects: 提前暴露的singleton實例
- registeredSingletons: 注冊的singleton實例的name集合
- singletonsCurrentlyInCreation: 當(dāng)前正在創(chuàng)建的singleton bean name
- inCreationCheckExclusions:
- disposableBeans: 實現(xiàn)DisposableBean接口的bean map, beanName -> bean
- containedBeanMap: 中文翻譯為"被包含的bean map",可以理解為outter bean對應(yīng)的inner bean map,
即為 outer bean -> inner bean map - dependentBeanMap: 中文翻譯為"從屬bean的map", 可以理解為bean和該bean依賴的bean列表組成的map, bean -> bean的依賴列表
- dependenciesForBeanMap:同上一項的含義相反, 表示一個bean和依賴該bean的所有bean列表, 可以理解為倒排, bean -> 依賴bean的列表
-
序列圖
- DefaultSingletonBeanFactory序列圖-1
- DefaultSingletonBeanFactory序列圖-2
- DefaultSingletonBeanFactory序列圖-4.png
- DefaultSingletonBeanFactory序列圖-5.png
-
> 至此, 從上到下第三層已經(jīng)分析完畢
FactoryBeanRegistrySupportLEVEL4-Abstract Class
- 根據(jù)文檔的注釋: 作為支持FactoryBean的singleton registry的基礎(chǔ)類, 集成了DefaultSingletonBeanRegistry對singleton bean的管理功能.