1、切入点表达式的写法
    切入点表达式:定位连接的方式
    execution(public int com.atguigu.aop.annotation.CalculatorImpl.add(int,int))
    execution( com.atguigu.aop.annotation.CalculatorImpl.(..))
    其中第一个表示任意的访问修饰符和返回值类型
    也可以通过
    表示包下任意的类或类中任意的方法
    ..表示任意的参数列表
    2、通知的类型
    a>前置通知:作用于目标对象方法执行之前
    @Before(“pointCut()”)
    public void beforeMethod(JoinPoint joinPoint){
    String methodName = joinPoint.getSignature().getName();
    String args = Arrays.toString(joinPoint.getArgs());
    System.out.println(“Logger—>前置通知,方法名:”+methodName+”,参数:”+args);
    }
    b>后置通知:作用于目标对象方法执行的finally语句块中
    @After(“pointCut()”)
    public void afterMethod(JoinPoint joinPoint){
    String methodName = joinPoint.getSignature().getName();
    System.out.println(“Logger—>后置通知,方法名:”+methodName);
    }
    c>返回通知:作用于目标对象方法的返回值之后
    注意:@AfterReturning中的属性returning,用来将通知方法的某个形参,接收目标对象方法的返回值
    @AfterReturning(value = “pointCut()”, returning = “result”)
    public void afterReturningMethod(JoinPoint joinPoint, Object result){
    String methodName = joinPoint.getSignature().getName();
    System.out.println(“Logger—>返回通知,方法名:”+methodName+”,结果:”+result);
    }
    d>异常通知
    注意:@AfterThrowing中的属性throwing,用来将通知方法的某个形参,接收目标对象方法的异常
    @AfterThrowing(value = “pointCut()”, throwing = “ex”)
    public void afterThrowingMethod(JoinPoint joinPoint, Throwable ex){
    String methodName = joinPoint.getSignature().getName();
    System.out.println(“Logger—>异常通知,方法名:”+methodName+”,异常:”+ex);
    }
    e>环绕通知
    @Around(“pointCut()”)
    public Object aroundMethod(ProceedingJoinPoint joinPoint){
    String methodName = joinPoint.getSignature().getName();
    String args = Arrays.toString(joinPoint.getArgs());
    Object result = null;
    try {
    System.out.println(“环绕通知—>目标对象方法执行之前”);
    //目标对象(连接点)方法的执行
    result = joinPoint.proceed();
    System.out.println(“环绕通知—>目标对象方法返回值之后”);
    } catch (Throwable throwable) {
    throwable.printStackTrace();
    System.out.println(“环绕通知—>目标对象方法出现异常时”);
    } finally {
    System.out.println(“环绕通知—>目标对象方法执行完毕”);
    }
    return result;
    }

    3、切入点表达式的重用
    通过@PointCut注解标识一个方法,设置公共的切入点表达式
    在当前的切面中,就可以通过调用方法的方式访问公共的切入点表达式
    @Pointcut(“execution( com.atguigu.aop.annotation.CalculatorImpl.(..))”)
    public void pointCut(){}

    @Before(“pointCut()”)
    public void beforeMethod(){
    System.out.println(“Logger—>前置通知”);
    }
    4、获取连接点的信息
    在通知方法的参数位置,设置JointPoint类型的参数,获取连接点相关的信息
    //获取连接点所对应的方法的方法名
    String methodName = joinPoint.getSignature().getName();
    //获取连接点所对应的方法的参数
    String args = Arrays.toString(joinPoint.getArgs());
    5、切面的优先级
    可以通过@Order的注解标识切面类,切面的优先级默认为Integer的最大值
    可以通过@Order的value属性设置切面的优先级,值越小优先级越高