Spring IOC概論

一澎埠、概念

Spring通過一個配置文件描述Bean及Bean之間的依賴關(guān)系。利用Java語言的反射功能實(shí)例化Bean并建立Bean之間的關(guān)系始藕。Spring的IoC容器在完成這些底層工作的基礎(chǔ)上蒲稳,還提供了Bean實(shí)例緩存、生命周期管理伍派、Bean實(shí)例代碼弟塞、事件發(fā)布、資源裝載等高級服務(wù)拙已。

IoC(Inversion of Control)
“控制反轉(zhuǎn)”决记,創(chuàng)建對象的權(quán)利,由程序員反轉(zhuǎn)給了Spring容器倍踪。用來管理對象的實(shí)例化和初始化系宫,以及對象從創(chuàng)建到銷毀的整個生命周期。這些對象統(tǒng)稱為Spring Bean,即Java對象建车,與new出來的對象一樣扩借。

  • 誰控制誰
    IoC 容器控制了對象。
  • 控制什么
    主要是外部資源獲取缤至。
  • 為何反轉(zhuǎn)
    由容器查找及注入依賴對象潮罪,對象只是被動的接受依賴對象。
  • 哪些方面反轉(zhuǎn)
    依賴對象的獲取领斥。

傳統(tǒng)創(chuàng)建對象的過程嫉到,如圖:


傳統(tǒng)創(chuàng)建對象.png

IOC/DI容器創(chuàng)建對象:


IOC容器創(chuàng)建對象.png

二、Spring容器高層視圖

Spring啟動時讀取應(yīng)用程序提供的Bean配置信息月洛,并在Spring容器中生成一份相應(yīng)的Bean配置注冊表何恶,然后根據(jù)這張注冊表實(shí)例化Bean,裝配好Bean之間的依賴關(guān)系,為上層應(yīng)用提供準(zhǔn)備就緒的運(yùn)行環(huán)境嚼黔。其中Bean緩存池為HashMap實(shí)現(xiàn)细层。


Spring 容器高層視圖.png

三、IOC容器實(shí)現(xiàn)

IoC的實(shí)現(xiàn)唬涧,必須依賴DI疫赎,因?yàn)镮oC只是負(fù)責(zé)對象的創(chuàng)建,而對象創(chuàng)建過程中需要將對象與對象的依賴進(jìn)行實(shí)現(xiàn)碎节。此時使用到的就是DI(Dependency Injection捧搞,依賴注入,它必須依賴于IoC)

Spring 通過讀取 XML 或 Java 注解中的信息來獲取哪些對象需要實(shí)例化实牡。

Spring 提供 2 種不同類型的 IoC 容器陌僵,即 BeanFactory 和 ApplicationContext 容器轴合。

BeanFactory(簡述)

BeanFactory是Spring框架的基礎(chǔ)設(shè)施,面向Spring本身创坞。
BeanFactory繼承體系


BeanFactory體系結(jié)構(gòu)圖.png
  1. BeanDefinitionRegistry 注冊表
    Spring配置文件中每一個節(jié)點(diǎn)元素在Spring容器里都通過一個BeanDefinition對象表示,它描述了Bean的配置信息受葛。而BeanDefinitionRegistry接口提供了向容器手工注冊BeanDefinition對象的方法题涨。
  2. BeanFactory頂層接口
    位于類結(jié)構(gòu)樹頂端,它最主要的方法就是getBean(String beanName),該方法從容器中返回特定名稱的Bean,BeanFactory的功能通過其他的接口得到不斷的擴(kuò)展总滩。
  3. ListableBeanFactory
    該接口定義了訪問容器中Bean基本信息的若干方法纲堵,如查看Bean的個數(shù)、獲取某一類型Bean的配置名闰渔、查看容器中是否包括某一Bean等方法席函。
  4. HierarchicalBeanFactory父子級聯(lián)
    父子級聯(lián)IOC容器的接口,子容器可通過接口方法訪問父容器冈涧;
    通過HierarchicalBeanFactory接口茂附,Spring的IOC容器可建立父子層次關(guān)聯(lián)的容器體系,子容器可訪問父容器中的Bean,但父容器不能訪問子容器的Bean督弓。Spring使用父子容器實(shí)現(xiàn)了很多功能营曼,比如在Spring MVC中,展現(xiàn)層Bean位于一個子容器中愚隧,而業(yè)務(wù)層和持久層的Bean位于父容器中蒂阱。這樣,展現(xiàn)層Bean就可引用業(yè)務(wù)層和持久層的Bean,而業(yè)務(wù)層和持久層的Bean則看不到展現(xiàn)層的Bean狂塘。
  5. ConfigurableBeanFactory
    一個重要接口录煤,增強(qiáng)了IOC容器的可定制性,它定義了設(shè)置類裝載器荞胡、屬性編輯器辐赞、容器初始化后置處理器等方法。
  6. AutowireCapableBeanFactory自動裝配
    定義了將容器中的Bean按某種規(guī)則(如按名字匹配硝训、按類型匹配等)進(jìn)行自動裝配的方法响委。
  7. SingletonBeanRegistry運(yùn)行期間注冊單例Bean
    定義了允許在運(yùn)行期間向容器注冊單實(shí)例Bean的方法;
    對于單實(shí)例(singleton)的Bean來說窖梁,BeanFactory會緩存Bean實(shí)例赘风,所以第二次使用getBean()獲取Bean時將直接從IOC容器的緩存中獲取Bean是來。Spring在DefaultSingletonBeanRegistry類中提供了一個用于緩存單實(shí)例Bean的緩存器纵刘,它是一個用HashMap實(shí)現(xiàn)的緩存器邀窃,單實(shí)例的Bean以beanName為鍵保存在這個HashMap中。
  8. 依賴日志框架
    在初始化BeanFactory時,必須為其提供一種日志框架瞬捕,如Log4J,即在類路徑下提供Log4J配置文件鞍历,這樣啟動Spring容器才不會報(bào)錯。

ApplicationContext(簡述)

ApplicationContext面向使用Spring框架的開發(fā)者肪虎,幾乎所有的應(yīng)用場合我們都直接使用ApplicationContext而非底層的BeanFactory劣砍。
ApplicationContext 由 BeanFactory 派 生 而 來 , 提 供 了 更 多 面 向 實(shí) 際 應(yīng) 用 的 功 能 扇救。ApplicationContext 繼承了 HierarchicalBeanFactory和ListableBeanFactory 接口刑枝,在此基礎(chǔ)上,還通過多個其他的接口擴(kuò)展了BeanFactory 的功能


ApplicationContext架構(gòu)體系.png
  1. ClassPathXmlApplicationContext:默認(rèn)從類路徑加載配置文件迅腔。
  2. FileSystemXmlApplicationContext:默認(rèn)從文件系統(tǒng)中裝載配置文件装畅。
  3. ApplicationEventPublisher:讓容器擁有發(fā)布應(yīng)用上下文事件的功能,包括容器啟動事件沧烈、關(guān)閉事件等掠兄。
  4. MessageSource:為應(yīng)用提供 i18n 國際化消息訪問的功能。
  5. ResourcePatternResolver : 所 有 ApplicationContext 實(shí)現(xiàn)類都實(shí)現(xiàn)了類似于PathMatchingResourcePatternResolver 的功能锌雀,可以通過帶前綴的 Ant 風(fēng)格的資源文件路徑裝載 Spring 的配置文件蚂夕。
  6. LifeCycle:該接口是 Spring 2.0 加入的,該接口提供了 start()和 stop()兩個方法汤锨,主要用于控制異步處理過程双抽。在具體使用時,該接口同時被 ApplicationContext 實(shí)現(xiàn)及具體Bean 實(shí)現(xiàn)闲礼, ApplicationContext 會將 start/stop 的信息傳遞給容器中所有實(shí)現(xiàn)了該接口的 Bean牍汹,以達(dá)到管理和控制 JMX、任務(wù)調(diào)度等目的柬泽。
  7. ConfigurableApplicationContext 擴(kuò)展于 ApplicationContext慎菲,它新增加了兩個主要
    的方法: refresh()和 close(),讓 ApplicationContext 具有啟動锨并、刷新和關(guān)閉應(yīng)用上下
    文的能力露该。在應(yīng)用上下文關(guān)閉的情況下調(diào)用 refresh()即可啟動應(yīng)用上下文,在已經(jīng)啟動的狀態(tài)下第煮,調(diào)用 refresh()則清除緩存并重新裝載配置信息解幼,而調(diào)用 close()則可關(guān)閉應(yīng)用上下文。

WebApplication體系結(jié)構(gòu)

WebApplicationContext是專門為Web應(yīng)用準(zhǔn)備的包警,它允許從相對于Web根目錄的路徑中裝載配置文件完成初始化工作撵摆。從WebApplicationContext中可獲得ServletContext的引用,整個Web應(yīng)用上下文對象將作為屬性放置到ServletContext中害晦,以便Web應(yīng)用環(huán)境可訪問Spring應(yīng)用上下文特铝。


WebApplicationContext.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鲫剿,更是在濱河造成了極大的恐慌鳄逾,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灵莲,死亡現(xiàn)場離奇詭異雕凹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)笆呆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門请琳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粱挡,“玉大人赠幕,你說我怎么就攤上這事⊙ぃ” “怎么了榕堰?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嫌套。 經(jīng)常有香客問我逆屡,道長,這世上最難降的妖魔是什么踱讨? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任魏蔗,我火速辦了婚禮,結(jié)果婚禮上痹筛,老公的妹妹穿的比我還像新娘莺治。我一直安慰自己,他們只是感情好帚稠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布谣旁。 她就那樣靜靜地躺著,像睡著了一般滋早。 火紅的嫁衣襯著肌膚如雪榄审。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天杆麸,我揣著相機(jī)與錄音搁进,去河邊找鬼。 笑死昔头,一個胖子當(dāng)著我的面吹牛饼问,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播减细,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼匆瓜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起驮吱,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤茧妒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后左冬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桐筏,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年拇砰,在試婚紗的時候發(fā)現(xiàn)自己被綠了梅忌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡除破,死狀恐怖牧氮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瑰枫,我是刑警寧澤踱葛,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站光坝,受9級特大地震影響尸诽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盯另,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一性含、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸳惯,春花似錦商蕴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至后德,卻和暖如春部宿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓢湃。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工理张, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绵患。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓雾叭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親落蝙。 傳聞我的和親對象是個殘疾皇子织狐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

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