package aopa;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Order(1)
@Aspect
@Component
public class ValidAspect {
@Before("execution(public int aopa.CalImpl.*(..))")
public void beforMethod(JoinPoint joinPoint) {
System.out.println("ValidAspect beforeMethod()....");
}
}
package aopa;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.Objects;
@Order(2)
@Aspect
@Component
public class Logging {
/*
//前置通知
@Before("execution(public int aopa.CalImpl.*(..))")
public void beforeMethod(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
System.out.println("前置通知 " + "MethodName : " + methodName + " Args : " + Arrays.asList(args));
}
//后置通知,无论该方法是否出现异常
@After("execution(public int aopa.CalImpl.*(..))")
public void afterMethod(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
System.out.println("后置通知 " + "MethodName : " + methodName + " Args : " + Arrays.asList(args));
}
//返回通知,可以访问方法返回值
@AfterReturning(value = "execution(public int aopa.CalImpl.*(..))", returning = "result")
public void afterReturn(JoinPoint joinPoint, Object result) {
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
System.out.println("后置返回通知 " + "MethodName : " + methodName + " Args : " + Arrays.asList(args) + " result : " + result);
}
//出现异常时候执行的代码
@AfterThrowing(value = "execution(public int aopa.CalImpl.*(..))", throwing = "ex")
public void afterThrow(JoinPoint joinPoint, Exception ex) {
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
System.out.println("异常通知 " + "MethodName : " + methodName + " Exception : " + ex);
}
*/
//环绕通知ProceedingJoinPoint参数,是否执行目标方法,必须有目标方法返回值,相当于动态代理
@Around("execution(public int aopa.CalImpl.*(..))")
public Object aroundMethod(ProceedingJoinPoint proceedingJoinPoint) {
Object result = null;
String methodName = proceedingJoinPoint.getSignature().getName();
Object[] args = proceedingJoinPoint.getArgs();
System.out.println("AroundMethod ....");
//执行目标方法
try {
//前置通知
System.out.println("前置通知 " + "MethodName : " + methodName + " Args : " + Arrays.asList(args));
result = proceedingJoinPoint.proceed();
System.out.println("后置返回通知 " + result);
} catch (Throwable throwable) {
throwable.printStackTrace();
System.out.println("异常通知 " + "MethodName : " + methodName + " Exception : " + throwable);
throw new RuntimeException();
}
System.out.println("后置通知 ");
return result;
}
}