近期我们项目组接收到一个任务,就是在之前开发的“智物”系统中添加一些功能,当然,这种添加是要符合设计模式“开闭原则”的,“对拓展开发,对修改关闭”,也就是说我们这次的功能拓展不可以修改以前系统的代码,一句也不可以改。那么在这种背景下进行开发的话,我们第一个想到的便是利用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包含“环绕通知”的执行顺序