面向切面程式設計AOP

2021-10-12 10:12:33 字數 2793 閱讀 1517

什麼時候要用到面向切面aop呢?

舉個例子,你想給你的**加上鑑權,

對某些url,你認為不需要鑑權就可以訪問,

對於某些url,你認為需要有特定許可權的使用者才能訪問

如果你依然使用oop,物件導向,

那你只能在那些url對應的controller**裡面,乙個乙個寫上鑑權的**

aop 是 aspect oriented programming 的縮寫,譯為面向切向程式設計。用我們最常用的 oop 來對比理解

物件設計的時候一般都是縱向思維,如果這個時候考慮這些不同類物件的共性,不僅會增加設計的難度和複雜性,還會造成類的介面過多而難以維護

需要對現有的物件動態增加某種行為或責任時非常困難

只要系統的業務模組都需要引用通用模組,就可以使用aop。

日誌記錄

事物處理

效能統計

安全控制

以日誌記錄為例,舉個小小的例子(期間用到的註解下文會講)

/**

* 日誌切面類

*/@aspect

@component

@slf4j

public class logaspect   

/*** 方法執行前

** @param joinpoint

* @throws exception

*/@before("controllermethod()")

public void logrequestinfo(joinpoint joinpoint) throws exception else

}log.info(requestlog.tostring());

}  /**

* 方法執行後

** @param resultvo

* @throws exception

*/@afterreturning(returning = "resultvo", pointcut = "controllermethod()")

public void logresultvoinfo(resultvo resultvo) throws exception   

}

aop 領域中的特性術語:

org.springframework.boot

spring-boot-starter-aop

用到的註解:

@aspect和@component

首先,這個@aspect注釋告訴spring這是個切面類,然後@compoment將轉換成spring容器中的bean或者是**bean。 總之要寫切面這兩個註解一起用就是了。

@pointcut

這個註解包含兩部分,pointcut表示式和pointcut簽名。表示式是拿來確定切入點的位置的,說白了就是通過一些規則來確定,哪些方法是要增強的,也就是要攔截哪些方法。

@pointcut(...........)括號裡面那些就是表示式。這裡的execution是其中的一種匹配方式

execution: 匹配連線點

within: 某個類裡面

this: 指定aop**類的型別

target:指定目標物件的型別

args: 指定引數的型別

bean:指定特定的bean名稱,可以使用萬用字元(spring自帶的)

@target: 帶有指定註解的型別

@args: 指定執行時傳的引數帶有指定的註解

@within: 匹配使用指定註解的類

@annotation:指定方法所應用的註解

@before

這個是決定advice在切入點方法的什麼地方執行的標籤,這個註解的意思是在切入點方法執行之前執行我們定義的advice。

/*** 方法執行前

** @param joinpoint

* @throws exception

*/@before("controllermethod()")

public void logrequestinfo(joinpoint joinpoint) throws exception {

@after

這個註解就是在切入的方法執行完之後把我們的advice增強加進去。一樣方法中可以新增joinpoint。

@around

這個註解可以簡單地看作@before和@after的結合。這個註解和其他的比比較特別,它的方法的引數一定要是proceedingjoinpoint,這個物件是joinpoint的子類。我們可以把這個看作是切入點的那個方法的替身,這個proceedingjoinpoint有個proceed()方法,相當於就是那切入點的那個方法執行,簡單地說就是讓目標方法執行,然後這個方法會返回乙個物件,這個物件就是那個切入點所在位置的方法所返回的物件。

@afterreturning

顧名思義,這個註解是在目標方法正常完成後把增強處理織入。這個註解可以指定兩個屬性(之前的三個註解後面的括號只寫乙個@pointcut表示式,也就是只有乙個屬性),乙個是和其他註解一樣的pointcut表示式,也就是描述該advice在哪個接入點被織入;然後還可以有個returning屬性,表明可以在advice的方法中有目標方法返回值的形參。

@afterthrowing

異常丟擲增強,在異常丟擲後織入的增強。有點像上面的@afterreturning,這個註解也是有兩個屬性,pointcut和throwing。

註解也就說完了,具體**實現呢,可以參考上面的小例子

aop 面向切面程式設計

起源 研究人員就對物件導向思想的侷限性進行了分析。他們研究出了一種新的程式設計思想,借助這一思想或許可以通過減少 重複模組從而幫助開發人員提高工作效率。隨著研究的逐漸深入,aop也逐漸發展成一套完整的程式設計思想,各種應用aop的技術也應運而生。aop思想 定義乙個切面,在切面的縱向定義處理方法,處...

AOP面向切面程式設計

1 概念 面向切面程式設計,通過預編譯方式和執行期動態 實現程式功能的統一維護的一種技術。aop是oop的延續,利用aop可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率 2 作用 1.解耦,將通用性的功能模組 與業務 解耦 ioc專...

AOP 面向切面程式設計

aop aspect oriented programming 即面向切面程式設計,可以說是oop object oriented programming 物件導向程式設計的補充和完善。面向切面程式設計是物件導向中的一種方式而已。在 執行過程中,動態嵌入其他 叫做面向切面程式設計。常見的使用場景 日...