我们用Spring的AOP切面做日志收集或者记录的时候,在springboot中用@Aspect注解。比如:
@Aspect
public class AdviceTest {
@Before("execution(* com.abc.service.*.many*(..))")
public void permissionCheck(JoinPoint point) {
System.out.println("@Before:模拟权限检查...");
System.out.println("@Before:目标方法为:" +
point.getSignature().getDeclaringTypeName() +
"." + point.getSignature().getName());
System.out.println("@Before:参数为:" + Arrays.toString(point.getArgs()));
System.out.println("@Before:被织入的目标对象为:" + point.getTarget());
}
@After("execution(* com.abc.service.*.many*(..))")
public void releaseResource(JoinPoint point) {
System.out.println("@After:模拟释放资源...");
System.out.println("@After:目标方法为:" +
point.getSignature().getDeclaringTypeName() +
"." + point.getSignature().getName());
System.out.println("@After:参数为:" + Arrays.toString(point.getArgs()));
System.out.println("@After:被织入的目标对象为:" + point.getTarget());
}
12345678910111213141516171819202122
@Before表示方法请求前执行,@After表示方法请求后执行,一般做记录的时候会使用@After比较多。但是有时候我们需要获取方法的返回值做判断该如何处理呢?首先,我们看@After的注解源码。
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface After {
String value();
String argNames() default "";
}
1234567
可以看到@After注解并不能获取到方法的返回值。这个时候我们需要的是@AfterReturning。
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface AfterReturning {
String value() default "";
String pointcut() default "";
String returning() default "";
String argNames() default "";
}
1234567891011
returning表示的就是返回值。应用如下:
@AfterReturning(value = "execution(* com.test.business.controller.TestController.audit*(..))",
returning = "methodResult")
public void afterReturning(JoinPoint joinPoint, Object methodResult) {
MethodSignature ms = (MethodSignature) joinPoint.getSignature();
Method method = ms.getMethod();
System.out.println("请求方法为:" + method.getName());
System.out.println("请求返回内容为:" + methodResult.toString());
}
123456789
这样就可以获取返回值,然后根据返回值做罗辑处理了。