AOP获取数据

(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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值