看完就理解Spring中的IOC和AOP兩大特徵

一、spring 的優點?

1.降低了組件之間的耦合性 ,實現了軟件各層之間的解耦
2.可以使用容易提供的衆多服務,如事務管理,消息服務等
3.容器提供單例模式支持
4.容器提供了AOP技術,利用它很容易實現如權限攔截,運行期監控等功能
5.容器提供了衆多的輔助類,能加快應用的開發
6.spring對於主流的應用框架提供了集成支持,如hibernate,JPA,Struts等
7.spring屬於低侵入式設計,代碼的污染極低
8.獨立於各種應用服務器
9.spring的DI機制降低了業務對象替換的複雜性
10.Spring的高度開放性,並不強制應用完全依賴於Spring,開發者可以自由選擇spring的部分或全部

二、什麼是IOC(DI)?

IOC,即控制反轉(Inversion of Control),他與依賴注入(Dependecy Injection)是同一個概念。具體的講:當某個角色需要另外一個角色協助的時候,在傳統的程序設計過程中,通常由調用者來創建被調用者的實例。但在spring中 創建被調用者的工作不再由調用者來完成,因此稱爲控制反轉。創建被調用者的工作由spring來完成,然後注入調用者因此也稱爲依賴注入。

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

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

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

  • Spring以動態靈活的方式來管理對象 , 注入的兩種方式,設置注入和構造注入。
  • 設置注入的優點:直觀,自然
  • 構造注入的優點:可以在構造器中決定依賴關係的順序。

三、什麼是AOP?

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

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

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

下面介紹一下AOP相關的術語:

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

  • 前置通知(Before):在目標方法被調用之前調用通知功能。
  • 後置通知(After):在目標方法完成之後調用通知,此時不會關心方法的輸出是什麼。
  • 返回通知(After-returning):在目標方法成功執行之後調用通知。
  • 異常通知(After-throwing):在目標方法拋出異常後調用通知。
  • 環繞通知(Around):通知包裹了被通知的方法,在被通知的方法調用之前和調用之後執行自定義的行爲。

2、連接點:是在應用執行過程中能夠插入切面的一個點。
3、切點: 切點定義了切面在何處要織入的一個或者多個連接點。
4、切面:是通知和切點的結合。通知和切點共同定義了切面的全部內容。
5、引入:引入允許我們向現有類添加新方法或屬性。
6、織入:是把切面應用到目標對象,並創建新的代理對象的過程。切面在指定的連接點被織入到目標對象中。在目標對象的生命週期中有多個點可以進行織入:

  • 編譯期: 在目標類編譯時,切面被織入。這種方式需要特殊的編譯器。AspectJ的織入編譯器就是以這種方式織入切面的。
  • 類加載期:切面在目標加載到JVM時被織入。這種方式需要特殊的類加載器(class
    loader)它可以在目標類被引入應用之前增強該目標類的字節碼。
  • 運行期:切面在應用運行到某個時刻時被織入。一般情況下,在織入切面時,AOP容器會爲目標對象動態地創建一個代理對象。SpringAOP就是以這種方式織入切面的

面向切面編程(AOP)完善spring的依賴注入(DI),面向切面編程在spring中主要表現爲兩個方面:

  1. 面向切面編程提供聲明式事務管理
  2. spring支持用戶自定義的切面

面向切面編程(aop)是對面向對象編程(oop)的補充, 面向對象編程將程序分解成各個層次的對象,面向切面編程將程序運行過程分解成各個切面。
AOP從程序運行角度考慮程序的結構,提取業務處理過程的切面,oop是靜態的抽象,aop是動態的抽象, 是對應用執行過程中的步驟進行抽象,,從而獲得步驟之間的邏輯劃分。
AOP框架具有的兩個特徵:

  1. 各個步驟之間的良好隔離性
  2. 源代碼無關性

四、總結:

IOC:控制反轉也叫依賴注入,IOC利用java反射機制,AOP利用代理模式。所謂控制反轉是指,本來被調用者的實例是有調用者來創建的,這樣的缺點是耦合性太強,IOC則是統一交給spring來管理創建,將對象交給容器管理,你只需要在spring配置文件總配置相應的bean,以及設置相關的屬性,讓spring容器來生成類的實例對象以及管理對象。在spring容器啓動的時候,spring會把你在配置文件中配置的bean都初始化好,然後在你需要調用的時候,就把它已經初始化好的那些bean分配給你需要調用這些bean的類。

AOP:面向切面編程。(Aspect-Oriented Programming)

AOP可以說是對OOP的補充和完善。OOP引入封裝、繼承和多態性等概念來建立一種對象層次結構,用以模擬公共行爲的一個集合。實現AOP的技術,主要分爲兩大類:一是採用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行爲的執行;二是採用靜態織入的方式,引入特定的語法創建“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的代碼,屬於靜態代理。

如果還不明白,放棄java吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章