(9)AOP获取数据
-
1.获取参数==》getArgs()方法
-
在通知类中定义的共性功能的方法声明上除了Around(环绕通知)添加ProceedingJoinPoint参数外,其余四种通知类型均使用JoinPoint参数
@Pointcut("execution(void com.aop..UserImpl.before(..))") public void method(){} public void before(JoinPoint jp){ Object[] args = jp.getArgs(); System.out.println("before通知获取到连接点的参数:"+ Arrays.toString(args)); }
-
-
-
在Around通知中,ProceedingJoinPoint参数的proceed方法有两个,一个无参,一个带参,若不对参数进行修改两个方法等价,若对参数进行了修改,并且想使用修改后的参数执行原始方法,必须使用带参的proceed方法==》运用该特性可以实现一些 参数合法性检测等等
@Pointcut("execution(String com.aop..UserImpl.around(..))") public void method3(){}; @Around("method3() ") public Object around(ProceedingJoinPoint pjp) throws Throwable { Object[] args = pjp.getArgs(); System.out.println("after通知获取到连接点的参数:"+Arrays.toString(args)); args[0] = "around长大了一岁"; args[1] = 19; Object obj = pjp.proceed(args); return "原始参数和返回值经过around通知后被修改了,"+obj; }
-
-
-
2.获取返回值
-
在定义通知类型的同时使用returning定义一个参数用于获取返回值
-
※※※returning指定的参数名必须和增强方法的参数名一致,否则报错
@AfterReturning(value = "method4()",returning = "res") public void returning(String res){ System.out.println("returning通知获取到连接点的返回值:"+res); }
-
-
3.获取原始方法抛出的异常
-
在定义通知类型的同时使用throwing定义一个参数用于获取异常信息
-
※※※throwing指定的参数名必须和增强方法的参数名一致,否则报错
@Pointcut("execution(void com.aop..UserImpl.*())Exception)") public void method5(){} @AfterThrowing(value = "method5()",throwing = "t") public void throwException(Throwable t){ System.out.println("returning通知获取到连接点的异常:"+t); }
-
(10)AOP案例实现模拟登陆匹配时参数处理
-
1.具体流程同(8)AOP案例
-
2.通知类中共性功能的处理
-
在不进行任何处理的情况下,用户名或密码后面添加空格,会导致验证失败,但真实场景可能会出现用户不小心输入空格还无法察觉===》使用环绕通知解决,含空格也验证成功,增强代码的健壮性
-
在增强功能的逻辑代码中,获取用户的信息,判断是否为字符串类型,是的话就使用其toString方法的trim方法去掉末尾用户误触输入的空格,并且密码长度从5已经变成了4
-
@Pointcut("execution(* com..*Service.*(..))") public void method(){} @Around("method()") public Object enhanceMethod(ProceedingJoinPoint pjp) throws Throwable { Object[] args = pjp.getArgs(); for (int i = 0; i < args.length; i++) { //判断参数列表是否为String类型 if (args[i] instanceof String){ args[i] = args[i].toString().trim(); } } Object res = pjp.proceed(args); System.out.println("执行环绕通知后的密码长度:"+args[1].toString().length());//4 return res; }