目錄
1. Web MVC發(fā)展史歷程
2.Spring概要
3.Spring-依賴注入概要(IOC)
4.屬性注入的三種實現(xiàn)方式
5.Spring-IoC XML裝配
6.Spring-XML設(shè)置Bean的值
7.Spring-IoC 注解(1)
8.Spring-IoC 注解(2)
9.Spring-AOP切面編程(1)
10.Spring-AOP切面編程(2)
未完待續(xù)...
一、產(chǎn)生的原因
在采用面向?qū)ο蠓椒ㄔO(shè)計的軟件系統(tǒng)中悔据,底層實現(xiàn)都是由N個對象組成的,所有的對象通過彼此的合作埠偿,最終實現(xiàn)系統(tǒng)的業(yè)務(wù)邏輯。即軟件系統(tǒng)中對象之間的耦合,對象A和對象B之間有關(guān)聯(lián),對象B又和對象C有依賴關(guān)系鹊汛,這樣對象和對象之間有著復(fù)雜的依賴關(guān)系菇爪,所以才有了控制反轉(zhuǎn)這個理論
二、什么是控制反轉(zhuǎn)和依賴注入
1柒昏、什么是控制反轉(zhuǎn)?
- IoC是Inversion of Control的縮寫,有的翻譯成“控制反轉(zhuǎn)”熙揍,還有翻譯成為“控制反向”或者“控制倒置”
- 1996年职祷,Michael Mattson在一篇有關(guān)探討面向?qū)ο罂蚣艿奈恼轮校紫忍岢隽薎oC 這個概念届囚。簡單來說就是把復(fù)雜系統(tǒng)分解成相互合作的對象有梆,這些對象類通過封裝以后,內(nèi)部實現(xiàn)對外部是透明的意系,從而降低了解決問題的復(fù)雜度泥耀,而且可以靈活地被重用和擴(kuò)展。IoC理論提出的觀點大體是這樣的:借助于“第三方”實現(xiàn)具有依賴關(guān)系的對象之間的解耦
- 所謂控制反轉(zhuǎn)就是應(yīng)用本身不負(fù)責(zé)依賴對象的創(chuàng)建及維護(hù)蛔添,依賴對象的創(chuàng)建及維護(hù)是由外部容器負(fù)責(zé)的痰催。 這樣控制權(quán)就由應(yīng)用轉(zhuǎn)移到了外部容器,控制權(quán)的轉(zhuǎn)移就是所謂反轉(zhuǎn)
2迎瞧、什么是依賴注入(DI)?
1夸溶、概念
- IoC的別名,2004年,Martin Fowler探討了同一個問題凶硅,既然IoC是控制反轉(zhuǎn)缝裁,那么到底是“哪些方面的控制被反轉(zhuǎn)了呢?”足绅,經(jīng)過詳細(xì)地分析和論證后捷绑,他得出了答案:“獲得依賴對象的過程被反轉(zhuǎn)了”∏饴瑁控制被反轉(zhuǎn)之后粹污,獲得依賴對象的過程由自身管理對象變?yōu)橛蒊oC容器主動注入。于是允懂,他給“控制反轉(zhuǎn)”取了一個更合適的名字叫做“依賴注入(Dependency Injection厕怜,DI)”。他的這個答案蕾总,實際上給出了實現(xiàn)IoC的方法:注入粥航。
- 所謂依賴注入,就是由IoC容器在運行期間生百,動態(tài)地將某種依賴關(guān)系注入到對象之中递雀。
- 所以,依賴注入(DI)和控制反轉(zhuǎn)(IoC)是從不同的角度描述的同一件事情蚀浆,就是指通過引入IoC容器缀程,利用依賴關(guān)系注入的方式搜吧,實現(xiàn)對象之間的解耦
2、依賴關(guān)系的四種情況
- 對象之間最弱的一種關(guān)聯(lián)方式杨凑,是臨時性的關(guān)聯(lián)滤奈。代碼中一般指由局部變量、函數(shù)參數(shù)撩满、返回值建立的對于其他對象的調(diào)用關(guān)系
- 四種情況
- ClassA中某個方法的參數(shù)類型是ClassB蜒程; 這種情況成為耦合;
- ClassA中某個方法的參數(shù)類型是ClassB的一個屬性伺帘; 這種情況成為緊耦合昭躺;
- ClassA中某個方法的實現(xiàn)實例化ClassB;
- ClassA中某個方法的返回值的類型是ClassB伪嫁;
- 如果出現(xiàn)了上述四種情況之一领炫,兩個類很有可能就是“依賴”關(guān)系。 依賴關(guān)系(Dependency):是類與類之間的連接张咳,依賴總是單向的帝洪。依賴關(guān)系代表一個類依賴于另一個類的定義
3、總結(jié)
(Dependency Injection)和控制反轉(zhuǎn)(Inversion of Control)是同一個概念脚猾。具體含義是:當(dāng)某個角色(可能是一個Java實例碟狞,調(diào)用者)需要另一個角色(另一個Java實例,被調(diào)用者)的協(xié)助時婚陪,在 傳統(tǒng)的程序設(shè)計過程中族沃,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實例。但在Spring里泌参,創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來完成脆淹,因此稱為控制反轉(zhuǎn);創(chuàng)建被調(diào)用者 實例的工作通常由Spring容器來完成,然后注入調(diào)用者沽一,因此也稱為依賴注入
三盖溺、使用IoC的好處
- 可維護(hù)性比較好,非常便于進(jìn)行單元測試铣缠,便于調(diào)試程序和診斷故障烘嘱。代碼中的每一個Class都可以單獨測試,彼此之間互不影響蝗蛙,只要保證自身的功能無誤即可蝇庭,這就是組件之間低耦合或者無耦合帶來的好處。
- 每個開發(fā)團(tuán)隊的成員都只需要關(guān)注自己要實現(xiàn)的業(yè)務(wù)邏輯捡硅,完全不用去關(guān)心其他人的工作進(jìn)展哮内,因為你的任務(wù)跟別人沒有任何關(guān)系,你的任務(wù)可以單獨測試壮韭,你的任務(wù)也不用依賴于別人的組件北发,再也不用扯不清責(zé)任了纹因。所以,在一個大中型項目中琳拨,團(tuán)隊成員分工明確瞭恰、責(zé)任明晰,很容易將一個大的任務(wù)劃分為細(xì)小的任務(wù)狱庇,開發(fā)效率和產(chǎn)品質(zhì)量必將得到大幅度的提高寄疏。
- 可復(fù)用性好,我們可以把具有普遍性的常用組件獨立出來僵井,反復(fù)應(yīng)用到項目中的其它部分,或者是其它項目驳棱,當(dāng)然這也是面向?qū)ο蟮幕咎卣髋病o@然,IoC更好地貫徹了這個原則社搅,提高了模塊的可復(fù)用性驻债。符合接口標(biāo)準(zhǔn)的實現(xiàn),都可以插接到支持此標(biāo)準(zhǔn)的模塊中形葬。
- IoC生成對象的方式轉(zhuǎn)為外置方式合呐,也就是把對象生成放在配置文件里進(jìn)行定義,這樣笙以,當(dāng)我們更換一個實現(xiàn)子類將會變得很簡單淌实,只要修改配置文件就可以了,完全具有熱插撥的特性
四猖腕、IoC的原理
控制反轉(zhuǎn)是Spring框架的核心拆祈。其原理是基于面向?qū)ο?OO)設(shè)計原則的The Hollywood Principle:Don't call us, we'll call you(別找我,我會來找你的)倘感。也就是說放坏,所有的組件都是被動的,所有的組件初始化和調(diào)用都由容器負(fù)責(zé)老玛。組件處在一個容器當(dāng)中淤年,由容器負(fù)責(zé)管理。簡單的來講蜡豹,就是由容器控制程序之間的關(guān)系麸粮,而非傳統(tǒng)實現(xiàn)中,由程序代碼直接操控镜廉,即在一個類中調(diào)用另外一個類豹休。這也就是所謂“控制反轉(zhuǎn)”的概念所在:控制權(quán)由應(yīng)用代碼中轉(zhuǎn)到了外部容器,控制權(quán)的轉(zhuǎn)移桨吊,即所謂反