畢業四年,工作三年,在實際項目中也會用到spring,但總是體會不深,最近一直在參加面試,最大的感受就是自己對一些東西的掌握不夠深,知其然未知其所以然。今天就把從網上收集來的spring的一些知識點整理以便日後翻閱,回顧和複習。
(一)什麼是IOC?
Spring最大的一個特點應該就是IOC。那什麼是IOC呢?IOC(Inversion of Control),中文翻譯反轉控制。是一個重要的計算機法則用來削減計算機程序的耦合問題,也是輕量級Spring框架的核心。
控制反轉一般分爲兩種:依賴注入和依賴查找。
依賴注入:應用比較廣泛,控制反轉包含兩個方面的內容,一個是控制,另一個是反轉,在程序中被調用類的選擇控制權從調用它的類中移除,轉交給第三方裁決,這個第三方指的就是spring容器,IOC另解,依賴注入,調用類被調用類的依賴關係由第三方注入,以移除調用類被調用類的引用。
來看不懂了?什麼是調用類被調用類的依賴關係由第三方注入?舉個栗子吧!
從西遊記到IOC
西遊記,家喻戶曉,老少皆宜,曲折的故事,動情的演繹,給小編的童年帶來無數的歡樂和驚喜,在西遊記中不少這樣的場景,每每唐僧被抓的時候,六小齡童扮演的孫悟空來到妖怪的洞口,妖怪總是問,來者何人,孫悟空回答:你孫爺爺在此,我們不妨通過一個java類爲這個場景進行編劇,並且伴隨古典名著來理解IOC的概念,是不是別有一番風味。
通過演員安排劇本,java代碼如下所示:
<span style="font-family:Comic Sans MS;font-size:18px;">
public class XiYouJi {
public void monsterAsk(){ //演員直接侵入劇本
LiuXiaoLingTong lxlt = new LiuXiaoLingTong ();
swk .responseAsk("你孫爺爺!");
}
}
</span>
通過上面的代碼部分,我們發現,作爲具體角色飾演者的六小齡童直接傾入到劇本中,這樣,使得劇本和演員直接耦合在一起。
一個聰慧的編劇在創作的時候應該圍繞故事的角色進行,而不應該考慮這個角色的具體扮演者,只有這樣,孫悟空的角色任選可以從衆多演員中自由的選擇,而非綁定在六小齡童一個人身上,通過分析,我們知道需要用主人公孫悟空定義一個接口,代碼如下所示:
<span style="font-family:Comic Sans MS;font-size:18px;">
public class XiYouJi {
public void monsterAsk() {
//引入孫悟空角色接口
SunWuKong swk = new SunWuKong();
//通過接口開展劇情
swk .responseAsk("你孫爺爺!");
}
}
</span>
我們引入了劇本的角色,也就是孫悟空,劇本的情節通過角色展開,在拍攝時角色由演員飾演,通過代碼我們可以知道 XiYouJi同時依賴於SunWuKong接口和LiuXiaoLingTong類,並沒有達到我們所期望的劇本僅依賴於角色的目的。但是角色最終必須通過具體的演員才能完成拍攝,如何讓LiuXiaoLingTong和劇本無關而又能完成SunWuKong的具體動作呢?當然是在西遊記投拍時,導演將LiuXiaoLingTong安排在SunWuKong的角色上,導演將劇本、角色、飾演者裝配起來。
通過引入導演,使劇本和具體飾演者解耦了。對應到軟件中,導演像是一個裝配器,安排演員表演具體的角色。 現在我們可以反過來講解IoC的概念了。IoC(Inverse of Control)的字面意思是控制反轉,它包括兩個內容: 即控制和反轉。
那到底是什麼東西的“控制”被“反轉”了呢?對應到前面的例子,“控制”是指選擇GeLi角色扮演者的控制權;“反轉”是指這種控制權從《墨攻》劇本中移除,轉交到導演的手中。對於軟件來說,即是某一接口具體實現類的選擇控制權從調用類中移除,轉交給第三方決定。
因爲IoC確實不夠開門見山,因此業界曾進行了廣泛的討論,最終軟件界的泰斗級人物Martin Fowler提出了DI(依賴注入:Dependency Injection)的概念用以代替IoC,即讓調用類對某一接口實現類的依賴關係由第三方(容器或協作類)注入,以移除調用類對某一接口實現類的依賴。“依賴注入”這個名詞顯然比“控制反轉”直接明瞭、易於理解。 那麼IOC有着怎麼樣的優點和缺點呢?請看如下對比
(二)IOC的優缺點:
IOC的優點:
1.實現組件之間的解耦,提高程序的靈活性和可維護性;
IOC的缺點:
1.創建對象的步驟變複雜了,不直觀,當然這是對不習慣這種方式的人來說
2.因爲使用反射來創建對象,所以在效率上會有些損耗,但相對於程序的靈活性和可維護性來說,這點損耗微不足道
3.缺少IDE重構的支持,如果修改了類名,還需要XML文件中手動修改,這是所有xml方式的缺憾所在。
(三)IOC的應用
IOC模式將耦合代碼從程序中移除,放到統一的xml文件裏面管理。由IOC容器通過配置文件對象來管理對象的生命週期、依賴關係等,這樣就可以避免修改和重新編譯具體的代碼,從而實現組件之間的解耦。