springboot之aop切面execution表達式,@args,@annotation

最近在使用springboot進行切面編程的時候,發現定義切面點有很多種方式,每種方式有每種方式的特點。特此記錄

execution表達式

基本語法格式爲:execution(<修飾符模式>?<返回類型模式><方法名模式>(<參數模式>)<異常模式>?)除了返回類型模式,方法名模式和參數模式外,其它項都是可選的。
例如:

 	@Pointcut("execution(public * cn.hjljy.*.controller..*.*(..))")
    public void logCut(){}
    @Around("logCut()")
    public Object validateParam(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("進入切面進行驗證");
        Object obj = joinPoint.proceed();
        return obj;
    }
模式 描述
public public 表示public 級別方法。 可以不寫,不寫就是所有的方法(public,private,protected等級別的方法)
開頭的 * 表示方法返回值的類型 * 表示全部
cn.hjljy.*.controller 表示具體的包名,中間使用*做通配符
表示包以及包下面的子包
* 表示全部
.*(…) 表示全部方法

@args 表達式

args主要是用來限制方法的參數的,args有兩種表現形式:@args 和args
使用@args需要通過註解,如果方法裏面有參數持有這個註解,就可以。
例如:

 	@Pointcut("@args(cn.hjljy.mlog.common.annotation.MlogLog)")
    public void logCut(){}
    @Around("logCut()")
    public Object validateParam(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("進入切面進行驗證");
        Object obj = joinPoint.proceed();
        return obj;
    }

如果某個方法例如:

  public void test(MlogCommentEntity entity) {
      //如果entity這個實體類上面有MlogLog這個註解,就會被切面切到。
   }

如果是args需要書寫方法參數類型並且是配合execution表達式進行的處理例如:

//第一種寫法
   @Around("execution( * cn..*.controller..*.*(..))&&args(..,org.springframework.validation.BindingResult)\"")
   public Object validateParam(ProceedingJoinPoint joinPoint) throws Throwable {
       System.out.println("進入切面進行驗證");
       Object obj = joinPoint.proceed();
       return obj;
   }
//第二種寫法
   @Around("execution( * cn..*.controller..*.*(..))&& args(..,bindingResult)")
   public Object validateParam(ProceedingJoinPoint joinPoint, BindingResult bindingResult) throws Throwable {
       System.out.println("進入切面進行驗證");
       Object obj = joinPoint.proceed();
       return obj;
   }
模式 描述
兩種寫法 表示任意參數開頭,方法最後一個入參是BindingResult 類型

@annotation 表達式

這個非常的常見,直接通過註解進行的切面。只需要在需要切面的方法上加上對應的註解就可以了。
例如:

	@Pointcut("@annotation(cn.hjljy.mlog.common.annotation.MlogLog)")
    public void logCut(){}
    @Around("logCut()")
    public Object validateParam(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("進入切面進行驗證");
        Object obj = joinPoint.proceed();
        return obj;
    }

然後在需要進行切面的方法上加上對應的註解就可以了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章