spring原理整理(一)

       畢業四年,工作三年,在實際項目中也會用到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容器通過配置文件對象來管理對象的生命週期、依賴關係等,這樣就可以避免修改和重新編譯具體的代碼,從而實現組件之間的解耦。







發佈了40 篇原創文章 · 獲贊 59 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章