AOP解析

    科技2024-11-12  13

           近期我们项目组接收到一个任务,就是在之前开发的“智物”系统中添加一些功能,当然,这种添加是要符合设计模式“开闭原则”的,“对拓展开发,对修改关闭”,也就是说我们这次的功能拓展不可以修改以前系统的代码,一句也不可以改。那么在这种背景下进行开发的话,我们第一个想到的便是利用AOP切面进行功能拓展了。所以,今天小编就来为大家分享一下AOP的细节。

            本篇我们重点分为两部分进行介绍:

           AOP获取目标方法的参数、返回值、异常信息的方式。

           AOP的5个通知执行顺序。

    一、AOP获取目标方法参数、返回值、异常信息的方式

    ①、获取目标方法的参数

    在通知方法中的形参列表中可以添加一个参数“JoinPoint joinPoint”,我们可以通过该参数来获取目标对象的方法和参数。

    joinPoint.getSignature( ) 获取方法的全签名

    joinPoint.getSignature( ).getName( ) 获取方法名称

    Object[] args=joinPoint.getArgs( )  获取目标方法的参数,参数想要打印出来需要Arrays.asList(args)

    ②、获取目标方法的返回值

    @Pointcut("execution(public int com.atguigu.impl.MyMathCalculator.*(..))") public void MyPoint(){}; @AfterReturning(value="MyPoint()",returning="result") public static void logReturn(JoinPoint joinPoint,Object result){ Signature signature = joinPoint.getSignature(); String name = signature.getName(); System.out.println("【"+name+"】方法正常执行完成,计算结果是:"+result); }

    ③、获取目标方法的异常信息

    @Pointcut("execution(public int com.atguigu.impl.MyMathCalculator.*(..))") public void MyPoint(){}; @AfterThrowing(value="MyPoint()",throwing="exception") public static void logException(JoinPoint joinPoint,Exception exception) { System.out.println("【"+joinPoint.getSignature().getName()+"】方法执行出现异常了,异常信息是【"+exception+"】); }

    二、AOP切面中5个通知的执行顺序

    ①、当有一个切面类的时候,执行顺序

    ②、当有多个切面类的时候,执行顺序

    以下有两个切面类:LogUtils切面类和VaAspect切面类

    --LogUtils未含“环绕通知”的执行顺序

    --LogUtils包含“环绕通知”的执行顺序

    Processed: 0.031, SQL: 8