package com.sam.annotation;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;


@Aspect //AOP 切面 定义了这个类就是一个扩展类
@Component
public class MyLogAspect {
   


    //切入点
    # @Pointcut(" (execution(* com.jing.text.xs.controller.*.*(..)))")  对已有的方法进行扩展
    @Pointcut(value = "@annotation(com.sam.annotation.MyLog)")  对注解进行扩展
    private void pointcut() {
   
    }


    /** * 方法执行后 * // 声明result时指定的类型会限制目标方法必须返回指定类型的值或没有返回值 // 此处将result的类型声明为Object,意味着对目标方法的返回值不加限制 * @param joinPoint * @param myLog * @param result * @return */
    @AfterReturning(value = "pointcut()", returning = "result")
    public Object afterReturning(JoinPoint joinPoint, MyLog myLog, Object result) {
   

// HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
// HttpSession session = request.getSession();

        System.out.println("++++执行了afterReturning方法++++");

        System.out.println("执行结果:" + result);

        return result;
    }

使用@AfterReturning注解可指定如下两个常用属性。

  1.    pointcut/value:这两个属性的作用是一样的,它们都属于指定切入点对应的切入表达式。一样既可以是已有的切入点,也可直接定义切入点表达式。当指定了pointcut属性值后,value属性值将会被覆盖。
    
  2.    returning:该属性指定一个形参名,用于表示afterReturning方法中可定义与此同名的形参,该形参可用于访问目标方法的返回值。除此之外,在afterReturning方法中定义该形参(代表目标方法的返回值)时指定的类型,会限制目标方法必须返回指定类型的值或没有返回值。
    

throwing:该属性指定一个形参名,用于表示afterReturning方法中可定义与此同名的形参,该形参可用于访问目标方法抛出的异常。除此之外,在Advice方法中定义该参数时,指定的类型,会限制方法必须抛出指定类型的异常。

@Aspect  
public class RepairAspect  
{
     
    // 匹配com.owenapp.service.impl包下所有类的、 
    // 所有方法的执行作为切入点 
    @AfterThrowing(throwing="ex"  
        , pointcut="execution(* com.owen.app.service.impl.*.*(..))")  
    // 声明ex时指定的类型会限制目标方法必须抛出指定类型的异常 
    // 此处将ex的类型声明为Throwable,意味着对目标方法抛出的异常不加限制 
    public void doRecoveryActions(Throwable ex)  
    {
     
        System.out.println("目标方法中抛出的异常:" + ex);  
        System.out.println("模拟Advice对异常的修复...");  
    }  
}  

AfterThrowing里面的 参数throwing,returning是接收的原来方法的抛出的异常 和 原来方法的返回值