spring的切面,AOP的afterThrowing参数处理解释说明

2020-11-20 15:07:02 浏览数 (1)

代码语言:javascript复制
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注解可指定如下两个常用属性。

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

代码语言:javascript复制
@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是接收的原来方法的抛出的异常 和 原来方法的返回值

0 人点赞