spring boot---aspect和三种拦截方式的比较

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yueloveme/article/details/85145390

大家推荐个靠谱的公众号程序员探索之路,大家一起加油,这个公众号已经接入图灵https://img-blog.csdnimg.cn/20181129224604602.png

代码配置

package com.zzh.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class SoutParamPoint {

   // 切入 任意的返回类型  com.zzh.controller下的任意类的任意方法
   @Around("execution(* com.zzh.controller.*.*(..))")
   public Object handleControllerMethod(ProceedingJoinPoint pjp) throws Throwable {
      System.out.println("进入切面");
      Object[] args = pjp.getArgs();

      System.out.println("aop--输出参数值");
      for (Object o : args){
         System.out.println(o.toString());
      }
      //执行拦截到的方法
      Object proceed = pjp.proceed();
      //返回值
      return proceed;
   }
}

@Befor(前置通知)
在方法调用之前 调用

@After(后置通知)
在方法返回之后调用

@Afterthrow
在方法出现异常后调用

@Around
环绕通知
优点:
1) 目标方法的调用由环绕通知决定,即你可以决定是否调用目标方法,而前置和后置通知   是不能决定的,他们只是在方法的调用前后执行通知而已,即目标方法肯定是要执行的。

2)  环绕通知可以控制返回对象,即你可以返回一个与目标对象完全不同的返回值,虽然这很危险,但是你却可以办到。而后置方法是无法办到的,因为他是在目标方法返回值后调用

三种拦截的区别

filter 可以得到 请求和响应 但是拿不到 方法的信息
interceptor 可以得到 请求和响应 也能拿到方法的信息 但是拿不到参数
aspect     可以拿到方法的信息和参数 但是拿不到请求和响应

顺序  
正常时过滤器 拦截器 切片(aspect)
异常时  切片(如果抛出)->ControllerAdvice->interceptor->filter
 

猜你喜欢

转载自blog.csdn.net/yueloveme/article/details/85145390
今日推荐