spring中爲什麼要使用IOC

開篇前言

 在前面的博文中,小編主要簡單的介紹了spring的入門知識,隨着學習的深入,我們知道spring最核心的兩大技術,IOC和AOP,這兩個技術也是spring最耀眼的地方,在後續的博文中小編將隆重介紹IOC和AOP,今天這篇博文,小編先簡單的介紹一下,IOC是什麼?在spring中爲什麼要使用IOC?IOC的優缺點以及IOC的應用。
 IOC是什麼?

 控制反轉(Inversion of Control,英文縮寫爲IoC)是一個重要的面向對象編程的法則來削減計算機程序的耦合問題,也是輕量級的Spring框架的核心。 控制反轉一般分爲兩種類型,依賴注入(Dependency Injection,簡稱DI)和依賴查找(Dependency Lookup)。依賴注入應用比較廣泛。控制反轉,包含兩個方面的內容,一個是控制,另一個是反轉,在程序中被調用類的選擇控制權從調用她的類中移除,轉交給第三方裁決,這個第三方指的就是spring的容器,IOC另解,依賴注入,調用類對被調用類的依賴關係由第三方注入,以移除調用類對被調用類的引用。其實小編覺得IOC這個概念還是比較晦澀難懂的,不容易讓人望文生義,不過IOC確實包含了很多的內在東西,涉及到代碼解耦,設計模式,代碼優化等等,接下來小編就通過一個簡單的demo,來幫助小夥伴們理解IOC的概念。

 從西遊記到IOC
 西遊記,家喻戶曉,老少皆宜,曲折的故事,動情的演繹,給小編的童年帶來無數的歡樂和驚喜,在西遊記中有不少這樣的場景,每每唐僧被抓的時候,六小齡童扮演的孫悟空來到妖怪的洞口,妖怪總是問,來者何人,孫悟空回答:你孫爺爺在此,我們不妨通過一個Java類爲這個場景進行編劇,並且伴隨古典名著來理解IOC的概念,是不是別有一番風味。

 通過演員安排劇本,java代碼如下所示:
public class XiYouJi {    
  public void monsterAsk(){    
       //演員直接侵入劇本    
        LiuXiaoLingTong  lxlt = new LiuXiaoLingTong ();  
      swk .responseAsk("你孫爺爺!");    
   }    
}   
 通過上面的代碼部分,我們發現,作爲具體角色飾演者的六小齡童直接傾入到劇本中,這樣,使得劇本和演員直接耦合在一起。 
 一個聰慧的編劇在創作的時候應該圍繞故事的角色進行,而不應該考慮這個角色的具體扮演者,只有這樣,孫悟空的角色任選可以從衆多演員中自由的選擇,而非綁定在六小齡童一個人身上,通過分析,我們知道需要用主人公孫悟空定義一個接口,代碼如下所示:
public class  XiYouJi {    
public void monsterAsk()    
{    
   //引入孫悟空角色接口    
    SunWuKong swk = new  SunWuKong();    

    //通過接口開展劇情    
    swk .responseAsk("你孫爺爺!");    

}    
}    
 我們引入了劇本的角色,也就是孫悟空,劇本的情節通過角色展開,在拍攝時角色由演員飾演,通過代碼我們可以知道 XiYouJi同時依賴於SunWuKong接口和LiuXiaoLingTong類,並沒有達到我們所期望的劇本僅依賴於角色的目的。但是角色最終必須通過具體的演員才能完成拍攝,如何讓LiuXiaoLingTong和劇本無關而又能完成SunWuKong的具體動作呢?當然是在西遊記投拍時,導演將LiuXiaoLingTong安排在SunWuKong的角色上,導演將劇本、角色、飾演者裝配起來。 
 通過引入導演,使劇本和具體飾演者解耦了。對應到軟件中,導演像是一個裝配器,安排演員表演具體的角色。 現在我們可以反過來講解IoC的概念了。IoC(Inverse of Control)的字面意思是控制反轉,它包括兩個內容: 即控制和反轉。
 那到底是什麼東西的“控制”被“反轉”了呢?對應到前面的例子,“控制”是指選擇GeLi角色扮演者的控制權;“反轉”是指這種控制權從《墨攻》劇本中移除,轉交到導演的手中。對於軟件來說,即是某一接口具體實現類的選擇控制權從調用類中移除,轉交給第三方決定。 
 因爲IoC確實不夠開門見山,因此業界曾進行了廣泛的討論,最終軟件界的泰斗級人物Martin Fowler提出了DI(依賴注入:Dependency Injection)的概念用以代替IoC,即讓調用類對某一接口實現類的依賴關係由第三方(容器或協作類)注入,以移除調用類對某一接口實現類的依賴。“依賴注入”這個名詞顯然比“控制反轉”直接明瞭、易於理解。 那麼IOC有着怎麼樣的優點和缺點呢?請看如下對比

 IOC的優點和缺點
 IOC的優點

     a、實現組件之間的解耦,提高程序的靈活性和可維護性。
 IOC的缺點:
     a、創建對象的步驟變複雜了,不直觀,當然這是對不習慣這種方式的人來說的。
     b、因爲使用反射來創建對象,所以在效率上會有些損耗。但相對於程序的靈活性和可維護性來說,這點損耗是微不足道的。
     c、缺少IDE重構的支持,如果修改了類名,還需到XML文件中手動修改,這似乎是所有XML方式的缺憾所在。
 IOC的應用:
 IOC模式將耦合代碼從程序中移出,放到統一的XML文件中管理。由IOC容器通過配置文件來管理對象的生命週期、依賴關係等,這樣就不用重新修改並編譯具體的代碼,從而實現組件之間的解耦。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章