代码演示如下所示:
一、思考:我们通过前置/后置通知的方式,该如何拿到原始的findName()方法中传入的参数值呢?
程序测试:(传入到findName()原始方法中的的参数是100)
BookDaoImpl:
通知类:(获取原始方法中传入的参数值步骤如图中所示)
测试结果:
二、通过环绕通知该如何拿原始方法中传入的参数值呢?
但是环绕通知相比着前置/后置通知会有一些牛逼的功能:
就是环绕通知可以获取到原始的方法传入的参数值后,可以对其参数值进行修改,然后再把修改后的参数值传给原始的方法。
能够这么做的原因是:
环绕通知中有一个pjp.proceed();功能,前面我们说过该功能是调用原始方法的,所以我们可以把修改后的参数值通过该方法传递给原始方法。
环绕通知类:
package com.itheima.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class MyAdvice {
// 切入点的位置
@Pointcut("execution(* com.itheima.dao.BookDao.findName(..))")
private void pt(){}
//ProceedingJoinPoint:专用于环绕通知,是JoinPoint子类,可以实现对原始方法的调用
@Around("pt()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("around 1.....");
/**
* 如何获取原始findName()方法中调用时传入的参数值:
* 第一步:通过pjp调用getArgs()方法
*/
Object[] args = pjp.getArgs();
/**
* 修改获取到原始方法中调用时传入的参数值,假设修改为666
*/
args[0] =666;
Object o = pjp.proceed(args); // 把修改后的原始方法参数值 传递给原始方法
System.out.println("around 2.....");
return o;
}
}
测试结果如下:
本来我们调用findName方法的时候传的值是100,从输出结果可以看出,原始方法findName()中传的参数值确实被我们修改了