IOC容器的設(shè)計(jì)與實(shí)現(xiàn)

Spring IOC容器的設(shè)計(jì):

第一條設(shè)計(jì)路徑:

從接口BeaFactory--->HierarchicalBeanFaxtory--->ConfigurableBeanFactory是一條主要的BeanFactory設(shè)計(jì)路徑辩诞。

BeanFactory:定義了容器基本的功能算利,就好像水桶能裝水一樣燥撞。

HierarchicalBeanFaxtory:增加了BeanFactory的方法觉啊,如增加了getParentBeanFactory()方法

ConfigurableBeanFactory:定義了一些BeanFactory的配置功能嘉抒。

第二條設(shè)計(jì)路徑:

從BeanFactory--->ListableBeanFactory--->ApplicationContext--->WebApplicationContext或者ConfigurableApplicationContext是以ApplicationContext為核心的接口設(shè)計(jì)姿鸿。

ListableBeabFactory:細(xì)化了BeanFactory接口的許多方法殖卑。

對(duì)于ApplicationiContext接口站削,他通過(guò)繼承MessageSource,ResourceLoader孵稽,ApplicationEventPublisher接口许起,在BeanFactory的簡(jiǎn)單IOC容器的基礎(chǔ)上添加了許多對(duì)高級(jí)容器的特性支持。

這里涉及是主要的接口系統(tǒng)菩鲜,而具體的容器都是在該接口系統(tǒng)下實(shí)現(xiàn)的园细。如DefaultListableBeanFactory就實(shí)現(xiàn)了ConfigrableBeanFactory。

BeanFactory應(yīng)用場(chǎng)景:

1接校、區(qū)分BeanFactory和FactoryBean:

BeanFactory是一個(gè)Factory猛频,也就是容器或?qū)ο蠊S,在Spring中蛛勉,所有的Bean都是由BeanFactory來(lái)進(jìn)行管理的鹿寻。FactoryBean是一個(gè)Bean,這個(gè)Bean不是一個(gè)簡(jiǎn)單的Bean诽凌,而是一個(gè)能產(chǎn)生或修飾對(duì)象生成的工廠Bean

2毡熏、BeanFactory定義了容器的基本方法,如:

通過(guò)接口方法containsBean讓用戶(hù)判斷容器中是否有指定名字的Bean

通過(guò)isSingleton方法來(lái)查詢(xún)制定名字的Bean是否是Singleton類(lèi)型的Bean

........

3侣诵、BeanFactory的設(shè)計(jì)原理:(以XmlBeanFactory容器為例)

XmlBeanFactory繼承了DefaultListableBeanFactory痢法,從而具有容器的重要基本功能狱窘。通過(guò)名字就可以猜到,XmlBeanFactory是一個(gè)與Xml相關(guān)的BeanFactory财搁,也就是說(shuō)蘸炸,他是一個(gè)可以讀取以XML方式定義的BeanDefinition的IOC容器。在XmlBeanFactory中妇拯,初始化了一個(gè)XmlBeanDefinitionReader,通過(guò)這個(gè)Reade對(duì)象來(lái)讀取以Xml方式定義的BeanDefinition幻馁。但是,首先要將這些BeanDefinition封裝成Resource類(lèi)來(lái)給出越锈,Resource類(lèi)是Spring用來(lái)封裝I/O操作的類(lèi)。然后將Resource類(lèi)作為構(gòu)造參數(shù)傳遞給XmlBeanFactory膘滨。在構(gòu)造函數(shù)中通過(guò)XmlBeanDefinitionReader的loadBeanDenfinitions(resources)來(lái)加載Bean甘凭。詳細(xì)請(qǐng)看XmlBeanFactory源碼。

ClassPathResource res = new ClassPathResource("bean.xml");

DefaultListableBeanFactory? factory = new DefaultListableBeanFactory();

XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);

reader.loadBeanDefinitions(res);

這樣火邓,我們就通過(guò)factory對(duì)象來(lái)使用DefautListableBeanFactory這個(gè)IOC容器丹弱,在使用容器時(shí),需要如下幾個(gè)步驟:

1铲咨、創(chuàng)建IOC配置文件的抽象資源躲胳,這個(gè)抽象資源包括了BeanDefinition的定義信息。

2纤勒、創(chuàng)建一個(gè)BeanFactory坯苹,這里使用DefauleListableBeanFactory。

3摇天、創(chuàng)建一個(gè)BeanDefinition讀取器粹湃,這里使用XmlBeanDefinitionReader來(lái)載入XML文件形式的Beanfinition,通過(guò)一個(gè)回調(diào)配置給BeanFactory泉坐。

4为鳄、從定義好的資源位置讀取配置信息,具體的解析過(guò)程由XmlBeanDefinitionReader來(lái)完成腕让。完成整個(gè)載入和注冊(cè)過(guò)程之后孤钦,這個(gè)容器就創(chuàng)建起來(lái)了。

ApplicationContext的應(yīng)用場(chǎng)景:

1纯丸、Application簡(jiǎn)單介紹

ApplicationContext是一個(gè)高級(jí)形態(tài)的IOC容器偏形,在BeanFactory的基礎(chǔ)上添加了附加功能,這些功能液南,為ApplicationContext提供了BeanFactory不具有的新特性壳猜。

-支持不同的信息源。ApplicationContext擴(kuò)展了MessageSource接口滑凉,這些信息源的擴(kuò)展功能可以支持國(guó)際化的實(shí)現(xiàn)统扳,為開(kāi)發(fā)多語(yǔ)言版本的應(yīng)用提供服務(wù)喘帚。

-訪(fǎng)問(wèn)信息。這一特性體現(xiàn)在對(duì)ResourceLoader和Resource的支持上咒钟,這樣我們可以從不同的地方得到Bean定義資源吹由,尤其是從不同I/O途徑得到Bean定義信息。具體來(lái)說(shuō)朱嘴,ApplicationContext都是繼承了DefaultResourceLoader倾鲫。DefaultResourceLoader是AbstractApplicationContext的基類(lèi)。

-支持應(yīng)用事件萍嬉。繼承了接口ApplicationEventPublisher乌昔,從而在上下文中引入了事件機(jī)制。這些時(shí)間和Bean的生命周期的結(jié)合俄日Bean的管理提供了便利壤追。

-在ApplicationContext中提供了附加服務(wù)磕道,使得ApplicationContext與簡(jiǎn)單的BeanFactory相比,對(duì)他的使用是一種面向框架的使用風(fēng)格行冰,所以一般建議在開(kāi)發(fā)應(yīng)用中使用ApplicationContext作為IOC容器的基本形式溺蕉。

2、ApplicationContext設(shè)計(jì)原理原理(以FileSystemXmlApplicationContext為例)

在FileSystemXmlApplicationContext的設(shè)計(jì)中悼做,其主要的功能已經(jīng)在它的基類(lèi)AbstractXmlApplicationContext中已經(jīng)實(shí)現(xiàn)疯特,在FileSystemXmlApplicationContext中只需要實(shí)現(xiàn)和他自身設(shè)計(jì)相關(guān)的兩個(gè)功能。

第一個(gè)功能是肛走,如果應(yīng)用直接使用FileSystemXmlApplicationContext漓雅,對(duì)于實(shí)例化這個(gè)應(yīng)用上下文的支持,同時(shí)啟動(dòng)IOC容器的refresh()的過(guò)程羹与。在FileSystemXmlApplicationContext的代碼中可以看到故硅,代碼如下:

public FileSystemXmlApplicationContext(String[] configLocations,boolean refresh,ApplicationContext parent) throws BeanException {

super(parent) ;

setConfigLocations(configLocations);

id(refresh){

refresh();

}

}

這個(gè)refresh()過(guò)程會(huì)牽扯到IOC容器啟動(dòng)的一系列復(fù)雜操作,同時(shí)纵搁,對(duì)于不同的容器實(shí)現(xiàn)吃衅,這些操作都是類(lèi)似的。

第二個(gè)功能是與FileSystemXmlApplicationContext設(shè)計(jì)具體相關(guān)的功能腾誉,這部分與怎樣從文件系統(tǒng)中記載XML的Bean定義資源有關(guān)徘层。通過(guò)這個(gè)過(guò)程,可以為在文件系統(tǒng)中讀取以XMl形式存在的BeanDefinition做準(zhǔn)備利职,不同的應(yīng)用上下文對(duì)應(yīng)著不同的讀取Bean Definition的方式趣效,在FileSystemXmlApplicationContext中實(shí)現(xiàn)的代碼如下:

protected Resource getResourceByPath(String path){

if(path != null && path.startsWith("/")){

path = path.substring(1);

}

return new FileSystemResource(path);

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市猪贪,隨后出現(xiàn)的幾起案子跷敬,更是在濱河造成了極大的恐慌,老刑警劉巖热押,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件西傀,死亡現(xiàn)場(chǎng)離奇詭異斤寇,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)拥褂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)娘锁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人饺鹃,你說(shuō)我怎么就攤上這事莫秆。” “怎么了悔详?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵镊屎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我伟端,道長(zhǎng)杯道,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任责蝠,我火速辦了婚禮,結(jié)果婚禮上萎庭,老公的妹妹穿的比我還像新娘霜医。我一直安慰自己,他們只是感情好驳规,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布肴敛。 她就那樣靜靜地躺著,像睡著了一般吗购。 火紅的嫁衣襯著肌膚如雪医男。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天捻勉,我揣著相機(jī)與錄音镀梭,去河邊找鬼。 笑死踱启,一個(gè)胖子當(dāng)著我的面吹牛报账,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播埠偿,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼透罢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了冠蒋?” 一聲冷哼從身側(cè)響起羽圃,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抖剿,沒(méi)想到半個(gè)月后朽寞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體识窿,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年愁憔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腕扶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吨掌,死狀恐怖半抱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情膜宋,我是刑警寧澤窿侈,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站秋茫,受9級(jí)特大地震影響史简,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肛著,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枢贿。 院中可真熱鬧殉农,春花似錦局荚、人聲如沸超凳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)轮傍。三九已至,卻和暖如春首装,著一層夾襖步出監(jiān)牢的瞬間创夜,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工簿盅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挥下,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓桨醋,卻偏偏與公主長(zhǎng)得像棚瘟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喜最,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

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