AOP執行過程解析

2021-07-05 14:16:15 字數 2402 閱讀 5630

上篇寫了動態**,這裡我們來看看aop吧……

aop面向切面程式設計的核心思想就是動態**

想要應用aop,主要有如下步驟:

1、編寫乙個切面類,在類中寫一些方法,在些方法上配置連線點(before、after、around、afterruturning、afterthrowing),在連線點後寫明切點("excecution( * com.yc.demo..*.*(..))")第乙個*表示任何型別的修飾符(public)和返回型別(int),第二個*表示類名,第三個*表示任何方法,..表示當前包或子包中,(..)表示任意個引數並且是任意型別,最後記住要在切面類上配置@aspect,@component,@order(1)(指定切面的先後順序,數字越小:該切面的@before方法在所有切面中越先執行,數字越大:該切面的@after方法在所有切面中越先執行)

2、在方法中寫上想要執行的操作,此方法就會在匹配的切點上根據連線點的時機來執行。

3、其實還要配置xml檔案才能執行呢:

在spring.xml檔案中配置如下資訊:

-------------掃包 ,可將實體類作為bean物件存於spring容器,按型別匹配

-------------自動掃瞄aspect,然後與匹配的bean建立**

4、小夥伴們此時,會發現還要匯入spring-aspects包來生成**物件,當然咯,要引入spring.xml還要spring-context-support包,在spring.xml中還要收入aop和context的命名空間咯。

再加上幾個名詞解釋加深理解吧:

切面(aspect):  橫切關注點(跨越應用程式多個模組的功能)被模組化的特殊物件

通知(advice):  切面必須要完成的工作

目標(target): 被通知的物件

**(proxy): 向目標物件應用通知之後建立的物件

連線點(joinpoint):程式執行的某個特定位置:如類某個方法呼叫前、呼叫後、方法丟擲異常後等。連線點由兩個資訊確定:方法表示的程式執行點;相對點表示的方位。例如 arithmethiccalculator#add() 方法執行前的連線點,執行點為 arithmethiccalculator#add(); 方位為該方法執行前的位置

切點(pointcut):每個類都擁有多個連線點:例如 arithmethiccalculator 的所有方法實際上都是連線點,即連線點是程式類中客觀存在的事務。aop 通過切點定位到特定的連線點。模擬:連線點相當於資料庫中的記錄,切點相當於查詢條件。切點和連線點不是一對一的關係,乙個切點匹配多個連線點,切點通過 org.springframework.aop.pointcut 介面進行描述,它使用類和方法作為連線點的查詢條件。

@before: 前置通知, 在方法執行之前執行

前置通知:在方法執行之前執行的通知

前置通知使用 @before 註解, 並將切入點表示式的值作為註解值.

@after: 後置通知, 在方法執行之後執行

後置通知是在連線點完成之後執行的, 即連線點返回結果或者丟擲異常的時候, 下面的後置通知記錄了方法的終止.

乙個切面可以包括乙個或者多個通知.

無論連線點是正常返回還是丟擲異常, 後置通知都會執行. 如果只想在連線點返回的時候記錄日誌, 應使用返回通知代替後置通知.

@afterrunning: 返回通知, 在方法返回結果之後執行

在返回通知中, 只要將 returning 屬性新增到 @afterreturning 註解中, 就可以訪問連線點的返回值. 該屬性的值即為用來傳入返回值的引數名稱.

必須在通知方法的簽名中新增乙個同名引數. 在執行時, spring aop 會通過這個引數傳遞返回值.

原始的切點表示式需要出現在 pointcut 屬性中

@afterthrowing: 異常通知, 在方法丟擲異常之後

只在連線點丟擲異常時才執行異常通知

將 throwing 屬性新增到 @afterthrowing 註解中, 也可以訪問連線點丟擲的異常. throwable 是所有錯誤和異常類的超類. 所以在異常通知方法可以捕獲到任何錯誤和異常.

如果只對某種特殊的異常型別感興趣, 可以將引數宣告為其他異常的引數型別. 然後通知就只在丟擲這個型別及其子類的異常時才被執行.

@around: 環繞通知, 圍繞著方法執行

環繞通知是所有通知型別中功能最為強大的, 能夠全面地控制連線點. 甚至可以控制是否執行連線點.

對於環繞通知來說, 連線點的引數型別必須是 proceedingjoinpoint . 它是 joinpoint 的子介面, 允許控制何時執行, 是否執行連線點.

在環繞通知中需要明確呼叫 proceedingjoinpoint 的 proceed() 方法來執行被**的方法. 如果忘記這樣做就會導致通知被執行了, 但目標方法沒有被執行.

注意: 環繞通知的方法需要返回目標方法執行之後的結果, 即呼叫 joinpoint.proceed(); 的返回值, 否則會出現空指標異常

Spark任務執行過程解析

spark submit sparksubmit main submit dorunmain runmain 通過反射,建立我們編寫的主類的例項物件,呼叫main方法 開始執行我們的 初始化sparkcontext物件 建立初始rdd 出發action運算元 提交job worker執行任務 任務結...

js的解析與執行過程

當輸入如下 時候 var a 1 function crli crli 1結果為 1 當改變下面 時候 var a 1 function crli crli undefined結果為 undefined 這是為什麼呢?js解析與執行過程一共有2個階段,乙個預處理階段,乙個是執行階段 可以看成全域性預...

mybatis執行過程深度解析(一)

mybatis的執行分為兩大步 1.讀取配置檔案快取到configuration物件中,用以建立sqlsessionfactory 2.sqlsession的執行過程。首先我們來說一下這個sqlsessionfactory構建 首先我們要知道,sqlsessionfactory是乙個介面,而不是乙個...