Java Spring IOC 容器2

接著開(kāi)始了解更加深入的東西戳吝。浩销。。骨坑。

在上篇中撼嗓,我們提到了兩個(gè)接口ApplicationContext,BeanFactory柬采。那么我們這章便從這里開(kāi)始了解這兩個(gè)接口欢唾。

Paste_Image.png

BeanFactoty 如上述結(jié)構(gòu)圖所示,它其實(shí)是一個(gè)最頂級(jí)的接口粉捻,它是最基層的接口信息礁遣,它提供了最基本的IOC容器使用方法。

The root interface for accessing a Spring bean container.
This is the basic client view of a bean container;

Paste_Image.png

這是Beanfactory所提供的所有接口肩刃,其功能依賴(lài)的注入功能其實(shí)都是依靠這個(gè)接口祟霍。它是可以將bean的信息保存起來(lái)(像xml)。
它定義了一個(gè)字符串盈包,“&”沸呐,用戶(hù)在使用&bean可以得到FactoryBean其本身,而不是獲取它產(chǎn)生的對(duì)象呢燥。獲取bean對(duì)象時(shí)崭添,只需要調(diào)用getBean方法,這個(gè)方法可以通過(guò)名稱(chēng)來(lái)獲取也可以增加其他參數(shù)叛氨。isPrototype 以及issingleton這些方法呼渣,來(lái)獲取這個(gè)bean的信息,并且這些信息都可以用用戶(hù)自己去控制寞埠。
HierarchicalBeanFactory這個(gè)接口中有一個(gè)方法:

Paste_Image.png

我們可以根據(jù)這個(gè)方法去獲取一個(gè)root 屁置,BeanFactory.通過(guò)該方法Spring實(shí)現(xiàn)了可以控制雙親IOC容器的能力。
以前的BeanFactory 的調(diào)用時(shí)用XmlBeanFactory來(lái)實(shí)現(xiàn)的仁连。之后的Spring使用ClassPathXmlApplicationContext這個(gè)類(lèi)來(lái)實(shí)現(xiàn)的蓝角。這個(gè)過(guò)程我在上篇中講過(guò),有興趣的可以去看看饭冬。這個(gè)類(lèi)是實(shí)現(xiàn)ConfigurableApplicationContext接口的一個(gè)類(lèi)帅容,可以說(shuō)這個(gè)類(lèi)是繼承自ApplicationContext。
這整個(gè)IOC容器其實(shí)就是在這樣的接口框架下實(shí)現(xiàn)的伍伤。從一方面來(lái)說(shuō)并徘,ApplicationContext其實(shí)是在BeanFactory這個(gè)最基層的容器上進(jìn)行加工實(shí)現(xiàn)更加復(fù)雜的功能。

javawork ja=(javawork)ac.getBean("javawork");

這個(gè)方法獲取bean正在調(diào)用的getbean其實(shí)是BeanFactory的方法扰魂。
整個(gè)IOC就是先初始化麦乞,ClassPathXmlApplicationContext這個(gè)類(lèi)初始化會(huì)傳入配置文件的地址蕴茴,Resource是封裝了Spring對(duì)于inputStream的操作。
2.開(kāi)始初始化factory:ConfigurableListableBeanFactory這個(gè)factory姐直。

Paste_Image.png

我們可以看到這個(gè)接口繼承于其他的三個(gè)倦淀,都是來(lái)源于BeanFactory。
refresh()中還初始化了一個(gè)XmlBeanDefinitionReader用來(lái)讀取xml配置文件声畏。
先從refresh()代碼中看撞叽,
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
這段代碼是初始化ConfigurableListableBeanFactory,進(jìn)入obtainFreshBeanFactory()函數(shù)插龄,

Paste_Image.png

這段代碼返回的就是一個(gè)BeanFactory,那么一個(gè)問(wèn)題資源配置在哪里讀愿棋?
我們接著向下看:refreshBeanFactory();
在其類(lèi)中是這樣的:

Paste_Image.png

是一個(gè)抽象方法,需要在其子類(lèi)中實(shí)現(xiàn)均牢。之前我發(fā)過(guò)的一張結(jié)構(gòu)圖糠雨,中間就是這類(lèi):AbstractRefeshableApplicationContext,其實(shí)我個(gè)人認(rèn)為這個(gè)名字就是告訴我們可以refresh.

Paste_Image.png

如果有factory存在先銷(xiāo)毀在建立,它生成了一個(gè)DefaultListableBeanFactory 類(lèi)徘跪。
而加載配置xml 是通過(guò)loadBeanDefinitions()這個(gè)方法甘邀。
這個(gè)方法應(yīng)是在XmlWebApplicationContext.class
這個(gè)類(lèi)中

Paste_Image.png

從中我們看到了loadBeanDefinitions(beanDefinitionReader);這段代碼,看名字應(yīng)該是引導(dǎo)配置文件的代碼垮庐。

Paste_Image.png

這個(gè)函數(shù)有個(gè)getConfigLocations()松邪,這個(gè)函數(shù)在本身的類(lèi)中是沒(méi)有實(shí)現(xiàn)的,它實(shí)際是用了AbstractRefreshableConfigApplicationContext這個(gè)類(lèi)的getConfigLocations()方法哨查。
現(xiàn)在我們就應(yīng)該可以看到為什么

Paste_Image.png

中有setConfigLocations這個(gè)方法逗抑,調(diào)用的是同一個(gè)對(duì)象。這就是為什么可以理解這個(gè)資源對(duì)象的地址來(lái)歷解恰。
然后調(diào)用
reader.loadBeanDefinitions(configLocation);
進(jìn)入到AbstractBeanDefinitionReader類(lèi)中對(duì)應(yīng)的方法中锋八。
中間進(jìn)行不斷的判斷,在跳轉(zhuǎn)到其子類(lèi)XmlBeanDefinitionReader中調(diào)用loadBeanDefinitions(EncodedResource encodedResource)
獲取inputstream护盈,再進(jìn)入protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)函數(shù)中便開(kāi)始不斷地解析xml挟纱。
這個(gè)調(diào)用饒了很多的彎,畫(huà)了張圖:

Paste_Image.png

Spring將三個(gè)模塊分開(kāi)腐宋,這使用戶(hù)如果去定制自己的Spring的話(huà)更加方便紊服。
這個(gè)解析過(guò)程完善了上一篇的不足。但這一篇還有applicationContext類(lèi)胸竞。
它的結(jié)構(gòu)是

Paste_Image.png

可以從中看出來(lái)欺嗤,其實(shí)該接口還實(shí)現(xiàn)了EnvironmentCapable ,ApplicationEventPublisher 以及MessageSource (除了BeanFactory的接口外)。
MessageSource是實(shí)現(xiàn)資源國(guó)家化的接口卫枝。ApplicationEventPublisher是事件處理煎饼,這些其實(shí)是更好的管理Bean。
這篇就先到這里了校赤。
若有問(wèn)題請(qǐng)私信吆玖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末筒溃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沾乘,更是在濱河造成了極大的恐慌怜奖,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翅阵,死亡現(xiàn)場(chǎng)離奇詭異歪玲,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)掷匠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)滥崩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人槐雾,你說(shuō)我怎么就攤上這事夭委》ǎ” “怎么了募强?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)崇摄。 經(jīng)常有香客問(wèn)我擎值,道長(zhǎng),這世上最難降的妖魔是什么逐抑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任鸠儿,我火速辦了婚禮,結(jié)果婚禮上厕氨,老公的妹妹穿的比我還像新娘进每。我一直安慰自己,他們只是感情好命斧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布田晚。 她就那樣靜靜地躺著,像睡著了一般国葬。 火紅的嫁衣襯著肌膚如雪贤徒。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,610評(píng)論 1 305
  • 那天汇四,我揣著相機(jī)與錄音接奈,去河邊找鬼。 笑死通孽,一個(gè)胖子當(dāng)著我的面吹牛序宦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播背苦,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼互捌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼堡僻!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起疫剃,我...
    開(kāi)封第一講書(shū)人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤钉疫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后巢价,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體牲阁,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年壤躲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了城菊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碉克,死狀恐怖凌唬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情漏麦,我是刑警寧澤客税,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站撕贞,受9級(jí)特大地震影響更耻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捏膨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一秧均、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧号涯,春花似錦目胡、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至久又,卻和暖如春巫延,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背地消。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工炉峰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脉执。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓疼阔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子婆廊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

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