深入理解Spring的兩大特徵(IOC和AOP)<轉>

來源:互聯網
上載者:User

標籤:很多   控制反轉   after   不同的   oom   如何擷取   區別   直接   如何   

在某博主的部落格上看到一篇解釋Spring的兩大核心IOC與AOP的文章,藉此轉寄一下,希望能夠協助到更多的人。

原文地址:68946881

眾所周知,Spring的核心特性就是IOC和AOP,IOC(Inversion of Control),即“控制反轉”;AOP(Aspect-OrientedProgramming),即“面向切面編程”。

IOC:IOC,另外一種說法叫DI(Dependency Injection),即依賴注入。它並不是一種技術實現,而是一種設計思想。在任何一個有實際開發意義的程式項目中,我們會使用很多類來描述它們特有的功能,並且通過類與類之間的相互協作來完成特定的商務邏輯。這個時候,每個類都需要負責管理與自己有互動的類的引用和依賴,代碼將會變的異常難以維護和極度的高耦合。而IOC的出現正是用來解決這個問題,我們通過IOC將這些相互依賴對象的建立、協調工作交給Spring容器去處理,每個對象只需要關注其自身的商務邏輯關係就可以了。在這樣的角度上來看,獲得依賴的對象的方式,進行了反轉,變成了由spring容器控制對象如何擷取外部資源(包括其他對象和檔案資料等等)。

通過一個簡單易懂的小故事來解釋IOC的依賴注入:

  某一天,你生病了,但是你不清楚自己到底得了什麼病,你只知道自己頭疼,咳嗽,全身無力。這個時候你決定去藥店買藥,藥店有很多種藥,僅僅是治療頭疼就有好幾十種,還有西藥中藥等區別。然後你自己看了看說明書,選擇了一盒你自己覺得最能治療自己病症的藥,付錢吃藥,期待可以早點好起來。 
但是這個過程,對於一個病人來說,太辛苦了。頭疼,咳嗽,全身無力,還要一個個的看藥品說明書,一個個的比較哪個藥比較好,簡直是太累了。這個時候,你決定直接去醫院看醫生。 
醫生給你做了檢查,知道你的病症是什麼,有什麼原因引起的;同時醫生非常瞭解有哪些藥能治療你的病痛,並且能根據你的自身情況進行篩選。只需要短短的十幾分鐘,你就能拿到對症下藥的藥品,即省時又省力。

在上面這個例子中,IOC起到的就是醫生的作用,它收集你的需求要求,並且對症下藥,直接把藥開給你。你就是對象,藥品就是你所需要的外部資源。通過醫生,你不用再去找藥品,而是通過醫生把藥品開給你。這就是整個IOC的精髓所在。

AOP:面向切面編程,往往被定義為促使軟體系統實現關注點的分離的技術。系統是由許多不同的組件所組成的,每一個組件各負責一塊特定功能。除了實現自身核心功能之外,這些組件還經常承擔著額外的職責。例如日誌、交易管理和安全這樣的核心服務經常融入到自身具有核心商務邏輯的組件中去。這些系統服務經常被稱為橫切關注點,因為它們會跨越系統的多個組件。

AOP的概念不好像IOC一樣執行個體化舉例,現在我們以一個系統中的具體實現來講講AOP具體是個什麼技術。

  我們以系統中常用到的事務管控舉例子。在系統操作資料庫的過程中,不可避免地要考慮到事務相關的內容。如果在每一個方法中都建立一個交易管理員,那麼無疑是對代碼嚴重的耦合和侵入。為了簡化我們的開發過程(實際上spring所做的一切實現都是為了簡化開發過程),需要把事務相關的代碼抽成出來做為一個獨立的模組。通過AOP,確認每一個操作資料庫方法為一個連接點,這些連接點組成了一個切面。當程式運行到其中某個一個切點時,我們將交易管理模組順勢織入對象中,通過通知功能,完成整個事務管控的實現。這樣一來,所有的操作資料庫的方法中不需要再單獨關心交易管理的內容,只需要關注自身的業務代碼的實現即可。所有的事務管控相關的內容都通過AOP的方式進行了實現。簡化了代碼的內容,將目標對象複雜的內容進行解耦,分離商務邏輯與橫切關注點。

AOP中相關的術語的介紹:

    • 通知: 通知定義了切面是什麼以及何時使用的概念。Spring 切面可以應用5種類型的通知:

      • 前置通知(Before):在目標方法被調用之前調用通知功能。
      • 後置通知(After):在目標方法完成之後調用通知,此時不會關心方法的輸出是什麼。
      • 返回通知(After-returning):在目標方法成功執行之後調用通知。
      • 異常通知(After-throwing):在目標方法拋出異常後調用通知。
      • 環繞通知(Around):通知包裹了被通知的方法,在被通知的方法調用之前和調用之後執行自訂的行為。
    • 連接點:是在應用執行過程中能夠插入切面的一個點。

    • 切點: 切點定義了切面在何處要織入的一個或者多個連接點。
    • 切面:是通知和切點的結合。通知和切點共同定義了切面的全部內容。
    • 引入:引入允許我們向現有類添加新方法或屬性。
    • 織入:是把切面應用到目標對象,並建立新的代理對象的過程。切面在指定的連接點被織入到目標對象中。在目標對象的生命週期中有多個點可以進行織入: 
      • 編譯期: 在目標類編譯時間,切面被織入。這種方式需要特殊的編譯器。AspectJ的織入編譯器就是以這種方式織入切面的。
      • 類載入期:切面在目標載入到JVM時被織入。這種方式需要特殊的類載入器(class loader)它可以在目標類被引入應用之前增強該目標類的位元組碼。
      • 運行期: 切面在應用運行到某個時刻時被織入。一般情況下,在織入切面時,AOP容器會為目標對象動態地建立一個代理對象。SpringAOP就是以這種方式織入切面的。

深入理解Spring的兩大特徵(IOC和AOP)<轉>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.