Spring自底向上探究

本文重點探究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

  1. 提供了alias的增刪改功能的接口

SimpleAliasRegistryLEVEL2 -- Concreate Class

  1. 使用map存儲alias -> 規(guī)范名稱 的映射蔫骂,并實現(xiàn)了AliasRegistry接口
  2. 注意事項
  • 注冊alias的時候有一個alias環(huán)校驗, 具體來說香罐,就是判斷name -> alias是不是存在, 注意由于有多重映射,所以需要遞歸判斷. 如: x -> y, 需要判斷是不是存在y -> x 或者是y -> z -> w -> x(所以需要遞歸校驗)
  • 由于遞歸性質(zhì)的存在, 包括hasAlias, retrieveAlias都有一個遞歸性的校驗
  • resolveAliases: 使用了StringResolver來處理alias和name

BeanDefinitionRegistry LEVEL2 -- interface)

  1. 在AliasRegistry的基礎(chǔ)上添加了BeanDefinition處理的相關(guān)接口
    • 增: registerBeanDefinition
    • 刪:removeBeanDefinition
    • 查:containsBeanDefinition学辱,getBeanDefinition,getBeanDefinitionCount,getBeanDefinitionNames念颈,isBeanNameInUse
  2. 按照文檔的說明:BeanDefinitionRegistry是Spring bean factory 包中唯一一個封裝了注冊BeanDefinition的接口, 標(biāo)準(zhǔn)的BeanFactory只提供了對工廠實現(xiàn)對象的操作

SingletonBeanRegistryLEVEL2 -- Interface

  1. 提供了單例的注冊讀取等连霉, 為了給BeanFactory提供一個操作單例的同一方式
  2. 可能涉及到同步問題榴芳, 后文中結(jié)合實現(xiàn)具體分析

BeanFactoryLEVEL2 --- Interface

  1. 是一個頂級的SpringBean容器, 表示一種比較通用的概念跺撼, 而它的子類比如ListableBeanFactory或者都是用于特殊的目的
  2. Bean容器會根據(jù)一個Bean name返回一個獨立的實例(原型模式)或者一個共享實例(單例模式)窟感, 稱之為scope, 從Spring2.0之后歉井, 更多的scope被支持了柿祈, 如“reques”和“session”scope
  3. 和ListableBeanfactory相反, HierarchicalBeanFactory支持從父容器獲得Bean的操作酣难, 如果Bean沒有被當(dāng)前容器找到谍夭, 父容器會被請求黑滴。
  4. &+beanname會獲得該bean所在的BeanFactory對象憨募, 如&myJndiObject會獲得該bean所屬的beanFactory
  5. 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

  1. 表示帶有層級關(guān)系的bean容器
  2. 帶有g(shù)etParentBeanFactory方法袁辈, ConfigurableBeanFactory中有對應(yīng)的setParentBeanFactory方法
  3. 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

  1. 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委托使用
  2. 一般流程

    • 重要的成員

      • 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

  1. 根據(jù)文檔的注釋: 作為支持FactoryBean的singleton registry的基礎(chǔ)類, 集成了DefaultSingletonBeanRegistry對singleton bean的管理功能.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荞彼,一起剝皮案震驚了整個濱河市冈敛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸣皂,老刑警劉巖抓谴,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異寞缝,居然都是意外死亡癌压,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門荆陆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滩届,“玉大人,你說我怎么就攤上這事被啼≈南” “怎么了棠枉?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泡挺。 經(jīng)常有香客問我术健,道長,這世上最難降的妖魔是什么粘衬? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任荞估,我火速辦了婚禮,結(jié)果婚禮上稚新,老公的妹妹穿的比我還像新娘勘伺。我一直安慰自己,他們只是感情好褂删,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布飞醉。 她就那樣靜靜地躺著,像睡著了一般屯阀。 火紅的嫁衣襯著肌膚如雪缅帘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天难衰,我揣著相機與錄音钦无,去河邊找鬼。 笑死盖袭,一個胖子當(dāng)著我的面吹牛失暂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鳄虱,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼弟塞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拙已?” 一聲冷哼從身側(cè)響起决记,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎倍踪,沒想到半個月后系宫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡惭适,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年笙瑟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癞志。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡往枷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情错洁,我是刑警寧澤秉宿,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站屯碴,受9級特大地震影響描睦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜导而,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一忱叭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧今艺,春花似錦韵丑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至实牡,卻和暖如春陌僵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背创坞。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工碗短, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摆霉。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓豪椿,卻偏偏與公主長得像奔坟,于是被迫代替她去往敵國和親携栋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容