版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yueloveme/article/details/85145390
大家推荐个靠谱的公众号程序员探索之路,大家一起加油,这个公众号已经接入图灵
代码配置
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