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方法中定义该参数时,指定的类型,会限制方法必须抛出指定类型的异常。
@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是接收的原来方法的抛出的异常 和 原来方法的返回值