Spring核心(ioc控制反轉),spring核心ioc反轉
IoC,Inversion Of Control 即控制反轉,由容器來管理業務對象之間的依賴關係,而非傳統方式中的由代碼來管理。
其本質,即將控制權由應用程式代碼轉到了外部容器,控制權的轉移就是所謂的反轉,其帶來的最大的好處是降低了業務對象之間的依賴程度,即實現瞭解耦。
Spring的IoC容器主要使用DI(Dependency Injection,依賴注入)方式實現的。不需要主動尋找,對象的尋找、定位和建立全部由容器管理,容器會將符合依賴關係的對象通過屬性(setter等)或者建構函式傳遞給需要的對象。
使用IoC可以帶來以下好處:
1、查詢依賴操作和應用代碼分離,大量減少了Factory和Singleton的數量,使代碼層次更加清晰,主要原因是我們不再尋找、定位、建立和管理對象之間的依賴關係了,都交給IoC容器管理了
2、沒有侵入性,不需要依賴容器的API,也不需要實現一些特殊介面。這樣我們的受控對象可以搬出容器進而單獨使用。
3、可以從IoC容器中直接獲得一個對象然後直接使用,而無需考慮對象的建立過程。(原廠模式)
從網上看了一個例子,覺得不錯,貼過來協助我們理解:
我們是如何找女朋友的?常見的情況是,我們到處去看哪裡有長得漂亮身材又好的mm,然後打聽她們的興趣愛好、qq號、電話號、ip號、iq號………,想辦法認識她們,投其所好送其所要,然後嘿嘿……這個過程是複雜深奧的,我們必須自己設計和面對每個環節。傳統的程式開發也是如此,在一個對象中,如果要使用另外的對象,就必須得到它(自己new一個,或者從JNDI中查詢一個),使用完之後還要將對象銷毀(比如Connection等),對象始終會和其他的介面或類藕合起來。 那麼IoC是如何做的呢?有點像通過婚介找女朋友,在我和女朋友之間引入了一個第三者:婚姻介紹所。婚介管理了很多男男女女的資料,我可以向婚介提出一個列表,告訴它我想找個什麼樣的女朋友,比如長得像李嘉欣,身材像林熙雷,唱歌像周杰倫,速度像卡洛斯,技術像施丹之類的,然後婚介就會按照我們的要求,提供一個mm,我們只需要去和她談戀愛、結婚就行了。簡單明了,如果婚介給我們的人選不符合要求,我們就會拋出異常。整個過程不再由我自己控制,而是有婚介這樣一個類似容器的機構來控制。Spring所倡導的開發方式就是如此,所有的類都會在spring容器中登記,告訴spring你是個什麼東西,你需要什麼東西,然後spring會在系統運行到適當的時候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的建立、銷毀都由 spring來控制,也就是說控制對象生存周期的不再是引用它的對象,而是spring。對於某個具體的對象而言,以前是它控制其他對象,現在是所有對象都被spring控制,所以這叫控制反轉
其實,我們可以把IoC看做是原廠模式的升華,IoC好比是一個大工廠,只不過在這個大工廠裡產生的對象都是在XML檔案中定義的,然後利用Java的反射執行個體化。在沒有Spring之前我們也是這麼做的,只是Spring的IoC更加強大完善。
有利就有斃,IoC也有一定的弊端:
1、使用反射變成,在效率上有些損耗。
2、缺乏更加智能的IDE,寫XML中時,錯誤不容易暴露,延遲到運行期才能發現。
但相對於IoC提高的維護性和靈活性來說,這點缺點又顯得微不足道
寫到最後,忽然想到《走遍美國》裡,唱片公司製片在rebaca錄製完唱片後對她說的一句話:Don't call us,we'll call you
用這句話來形容IoC再合適不過。