1. 程式人生 > >關於 spring-aop理解

關於 spring-aop理解

div 運行時 advice 定義 運行 proc targe -a 切點

對於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 ) 通過翻身執行目標對象連接點處的方法

不過使用新的入參替換原來的入參

關於 spring-aop理解