3.spring 4 剖析-DefaultListableBeanFactory梳理

前言

通過之前對BeanDefinition注冊的分析,我們得知抛人,注冊的主要類是DefaultListableBeanFactory,那今天我們就分析一下DefaultListableBeanFactory的實現(xiàn)關(guān)系。

類圖

DefaultListableBeanFactory類圖

我們從上層的頂級接口開始梳理脐瑰,如果想知道DefaultListableBeanFactory都可以干什么函匕,需要知道上層的接口都定義了什么。

我們可以關(guān)注這樣幾個類:BeanFactory/HierarchicalBeanFactory/ListableBeanFactory/ConfigurableBeanFactory/AutowireCapableBeanFactory/AbstractBeanFactory/AbstractAutowireCapableBeanFactory

這些都梳理后蚪黑,我們就可以了解了DefaultListableBeanFactory都可以干什么了盅惜。

源碼分析

BeanFactory

BeanFactory類結(jié)構(gòu)圖

從圖中,可以看出來忌穿,此接口定義了獲取Bean的公眾方式抒寂,以及Bean的一些基本信息判斷,比如isSingleton/isPrototype/isTypeMatch

還有一個需要注意的地方掠剑,看這個常量:

String FACTORY_BEAN_PREFIX = "&";

如果我們在獲取Bean的時候屈芜,使用&則獲取的是FactoryBean本身對象,否則是獲取getObject的代理對象。

看個例子:

public class Test {
    public static void main(String[] args) throws Exception {
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        
        beanFactory.registerBeanDefinition("springBean",new RootBeanDefinition(PersonFactoryBean.class));

        System.out.println(beanFactory.getBean("springBean"));
        System.out.println(beanFactory.getBean("&springBean"));

    }

    static class PersonFactoryBean implements FactoryBean<Person>{
        @Override
        public Person getObject() throws Exception {
            return new Person();//可以做代理操作
        }
        @Override
        public Class<?> getObjectType() {
            return Person.class;
        }
        @Override
        public boolean isSingleton() {
            return true;
        }
    }
    @Data
    static class Person {
        private String name;
    }
}

輸出 :

Test.Person(name=null)
Test$PersonFactoryBean@1f5a0bc0

(關(guān)于FactoryBean井佑,以后再來討論属铁,現(xiàn)在可以認為是一個特殊的Spring的實現(xiàn)方式)

HierarchicalBeanFactory

可以獲取父容器的相關(guān)BeanFactory

ListableBeanFactory

BeanFactory接口定義的都是對于一個Bean的獲取和判斷操作,此接口則定義了批量的Bean獲取和判斷操作:

ListableBeanFactory類結(jié)構(gòu)圖

比如:

  1. getBeanDefinitionCount:獲取所有BeanDefinition的個數(shù)
  2. getBeanNamesForType: 獲取所有此類型的BeanName
  3. getBeanNamesForAnnotation: 獲取此注解下的所有 BeanName

不一一舉例了躬翁,都是對于BeanDefinition的批量操作的擴展焦蘑。

ConfigurableBeanFactory

public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {
//代碼省略
}

它擁有了HierarchicalBeanFactory和SingletonBeanRegistry(單例注冊)的功能。


ConfigurableBeanFactory的類結(jié)構(gòu)圖分析

AutowireCapableBeanFactory

對于已存在的Bean進行裝配暴露盒发,多用于集成其他框架使用:


AutowireCapableBeanFactory的解釋

ConfigurableListableBeanFactory

public interface ConfigurableListableBeanFactory
        extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {
}

ConfigurableListableBeanFactory擁有了ListableBeanFactory/AutowireCapableBeanFactory/ConfigurableBeanFactory功能以外例嘱,還提供了一些擴展的功能:比如分析和修改BeanDefinition的一些功能。

AbstractBeanFactory宁舰、AbstractAutowireCapableBeanFactory

通過類圖拼卵,得知,AbstractBeanFactory一定是可配置BeanFactory和注入BeanDefinition的是一個抽象模板類蛮艰。
AbstractAutowireCapableBeanFactory在 AbstractBeanFactory的基礎(chǔ)上腋腮,增加了可裝配的功能(AutowireCapableBeanFactory).

當然,今天梳理的都是接口關(guān)系壤蚜,和接口的能力低葫,具體實現(xiàn),之后再進行分析仍律。

DefaultListableBeanFactory

此時再來看這個類嘿悬,會清晰很多。

首先它本身就是一個BeanDefinitionRegistry水泉,可以完成注冊功能善涨。

再次,它是一個有層次的工廠類實現(xiàn)草则,因為它實現(xiàn)了AutowireCapableBeanFactory,且因為它實現(xiàn)了很多BeanDefinition的操作功能(BeanFactory:單個Bean的操作钢拧,ListableBeanFactory:批量Bean的操作)

ok,現(xiàn)在我們已經(jīng)對DefaultListableBeanFactory的能力進行了一個大概的梳理炕横。

小結(jié)

對于關(guān)鍵的工廠類DefaultListableBeanFactory源内,我們進行了一個非常詳細的梳理。

當然份殿,今天不涉及具體的實現(xiàn),以后可以再對實現(xiàn)進行研究卿嘲。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沃疮,一起剝皮案震驚了整個濱河市司蔬,隨后出現(xiàn)的幾起案子俊啼,更是在濱河造成了極大的恐慌吨些,老刑警劉巖豪墅,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偶器,死亡現(xiàn)場離奇詭異屏轰,居然都是意外死亡霎苗,警方通過查閱死者的電腦和手機唁盏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刽严,“玉大人舞萄,你說我怎么就攤上這事管削。” “怎么了把还?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵吊履,是天一觀的道長。 經(jīng)常有香客問我酌伊,道長缀踪,這世上最難降的妖魔是什么驴娃? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任蔗草,我火速辦了婚禮疆柔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘模叙。我一直安慰自己鞋屈,他們只是感情好谐区,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布昭抒。 她就那樣靜靜地躺著灭返,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坤邪。 梳的紋絲不亂的頭發(fā)上熙含,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天艇纺,我揣著相機與錄音怎静,去河邊找鬼邮弹。 笑死,一個胖子當著我的面吹牛蚓聘,可吹牛的內(nèi)容都是我干的腌乡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼夜牡,長吁一口氣:“原來是場噩夢啊……” “哼与纽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起塘装,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤急迂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蹦肴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體僚碎,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年冗尤,在試婚紗的時候發(fā)現(xiàn)自己被綠了听盖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胀溺。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡裂七,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仓坞,到底是詐尸還是另有隱情背零,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布无埃,位于F島的核電站徙瓶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嫉称。R本人自食惡果不足惜侦镇,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望织阅。 院中可真熱鬧壳繁,春花似錦、人聲如沸荔棉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽润樱。三九已至渣触,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壹若,已是汗流浹背嗅钻。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工皂冰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人养篓。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓灼擂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親觉至。 傳聞我的和親對象是個殘疾皇子剔应,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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