Spring總結——AOP概述
概念:
AOP是Aspect-Oriented-Programming(面向方面程式設計或面向切面程式設計)的簡稱,可以通過預編譯方式和執行期動態代理實現在不修改原始碼的情況下給程式動態統一新增功能的一種技術。它實際是GoF設計模式的延續,設計模式追求的是呼叫者和被呼叫者之間的解耦,提高程式碼的靈活性和可擴充套件行,AOP可以說也是這種目標的一種實現。
在Spring中提供了面向切面程式設計的豐富支援,允許通過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務(transaction)管理)進行內聚性的開發。通俗的說,應用物件只實現它們應該做的——完成業務邏輯——僅此而已。它們並不負責其它的系統級關注點,例如日誌或事務支援。可以說aop的思想是橫向重複,縱向抽取。
舉例:
主要功能:
日誌記錄、效能統計、安全控制、事務處理,異常處理等。
主要意圖:
將日誌記錄、效能統計、安全控制、事務處理、異常處理等程式碼從業務邏輯程式碼中劃分出來,通過這些行為的分離,我們希望可以將它們獨立到非指導業務邏輯的方法中,進而改變這些行為的時候不影響業務邏輯的程式碼。
spring實現aop的原理:
1)動態代理(優先):被代理物件必須要實現介面,才能產生代理物件,如果沒有介面將不能使用動態代理技術。
2)cglib代理(沒有介面):第三方代理技術,cglib代理可以對任何類生成代理,代理的原理是對目標物件進行繼承代理。如果目標物件被final修飾,那麼該類無法被cglib代理。
aop術語:
Joinpoint(連線點):
連線點是指那些被攔截到的點。在 spring 中,這些點指的是方法,因為 spring 只支援方法型別的連線點.。也可以理解為所有可以織入通知的方法。
Pointcut(切入點):
切入點指我們要對哪些 Joinpoint 進行攔截的定義。
一個專案中有很多的類,一個類有很多個連線點,當我們需要在某個方法前插入一段增強(advice)程式碼時,我們就需要使用切點資訊來確定,要在哪些連線點上新增增強。如果把連線點當做資料庫中的記錄,那個切點就是查詢該記錄的查詢條件。所以一般我們要實現一個切點時,那麼我們需要判斷哪些連線點是符合我們的條件的,如:方法名是否匹配、類是否是某各類、以及子類等。也可以理解為需要|已經織入通知的方法。
Advice(通知/增強):
通知是指攔截到 Joinpoint 之後所要做的事情就是通知.通知分為前置通知,後置通知,異常通知,最終通知,環繞通知。aop是用來給某一類特殊的連線點新增一些特殊的功能,那麼我們新增的功能也就是增強,如新增日誌、管理事務。我們可以理解為需要增強的程式碼。
增強不僅僅包含需要只能去增強的程式碼。同時還包含方位資訊。方位資訊就相當於方法的位置資訊,如:方法前、方法後、方法環繞。
通知型別:
前置通知 :在目標方法執行之前執行.
後置通知 :在目標方法執行之後執行
環繞通知 :在目標方法執行前和執行後執行
異常丟擲通知:在目標方法執行出現 異常的時候 執行
最終通知 :無論目標方法是否出現異常 最終通知都會 執行.
Target(目標物件):
目標物件就是我們需要對它進行增強的業務類。如果沒有AOP,那麼該業務類就得自己實現需要的功能。
Introduction(引介):
引介是一種特殊的增強。它為類新增一些屬性和方法。這樣,即使一個業務類原本沒有實現某個介面,通過AOP的引介功能,我們可以動態的為該業務類新增介面的實現邏輯,讓業務類成為這個介面的實現類。
Weaving(織入):
織入就是將增強新增到目標類具體連線點上的過程。織入分為編譯期織入,類裝載期織入,動態代理織入。
Spring採用的是動態代理織入,而AspectJ採用編譯期織入和類裝載期織入。
Proxy(代理):
一個類被AOP織入後生成出了一個結果類,它是融合了原類和增強邏輯的代理類。
Aspect(切面):
切面由切點和增強(或引介)組成,或者只由增強(或引介)實現。