關於 spring-aop理解
對於Aop 一直理解很是不到位 談談自己理解!
Aop :
Aspect: 切面 joinpoint 連線點 pointCut 切點 Advice 增強 targert 目標物件 weaving 織入 introduction等組成
理解幾個關鍵字:
採用springboot 方式來快速實現的理解:
故事:月黑風高殺人夜,一個人作案,但是被一個老王看見了 ,由於天氣原因老王只看見是一個男的 高175公分,公安局要將10個175 男性抓起來,進行審問。
pointCut:切點
所謂的切點:男 175 可以理解為是對我們要對哪些方法進行增強的描述,好比我們買菸 對要買哪一類的描述
程式碼體現在:* com.lwd.web.controller.*.*(..) 這裡就是切點的描述 說任意型別的 com.lwd.web.controller 任意方法 任意引數的 最終說明了要增強的是哪一類方法
@PointCut("execution(* com.lwd.web.controller.*.*(..))") public void say(){}
joinpoint 連線點
連線點:是一個比較更抽象的概念。 10 個人中每一個具體的人 也就是程式碼執行過程中具體的增強方法 具體的public com.lwd.web.controller.eat(){} 這個方法
Advice 增強 審訊的動作
before after afterreturning round 等五種增強
增強就是將對切點描述的方法 新增加執行的程式碼
@Aspect public class Aspect{ @PointCut("execution(* com.lwd.web.controller.*.*(..))") public void say(){} @before("say") public void sayeat(){ 新的程式碼 } }
Aspecct 切面 故事加起來
那麼什麼是切面:個人理解 切面就是如果我們要對一個方法要進行增強 (增強:增加這個方法功能) 又不想改變原有方法 雖然我們可以採用代理的方式,aop本身就是動態代理實現 我們要如何將我們寫的程式碼和原有的方法結合起來,我們寫的增強程式碼放在那裡 在什麼時間增強這個程式碼 定義的這個切面類就是對上面囉嗦的抽象出來的類。也是上面 joinpoint + pointcut + advice 所有構成了切面
@Aspect public class AopAspect(){ }
在使用aop 的時候我們通常會通過joinpoint 連線點獲取增強方法資訊
joinpoint 提供了
getArgs() 獲取連線點方法執行時的入參列表
getSignature() 獲取連線點方法簽名物件 方法資訊
getTarget() 獲取連線點所在的目標物件 方法所在類的物件
getThis() 獲取代理物件本身 代理物件
proceedingJoinpoint
繼承了joinpoint 新增了兩個介面
proceed() 通過反射執行目標物件的連線點出方法
proceed(Objecct [] args ) 通過翻身執行目標物件連線點處的方法
不過使用新的入參替換原來的入參