@Pointcut("@annotation(com.cy.pj.common.annotation.RequiredLog)")
public void doLog() {
}
@Around("doLog()")
public Object doLogAround(ProceedingJoinPoint joinPoint)
throws Throwable{
//目的:获取切入点方法上自定义RequiredLog注解中operation属性值
//1.1获取目标对象对应的字节码对象
Class<?> targetCls=joinPoint.getTarget().getClass();
//1.2获取目标方法对象
//1.2.1 获取方法签名信息从而获取方法名和参数类型
Signature signature=joinPoint.getSignature();
//1.2.1.1将方法签名强转成MethodSignature类型,方便调用
MethodSignature ms= (MethodSignature)signature;
//1.2.2通过字节码对象以及方法签名获取目标方法对象
Method targetMethod=targetCls.getDeclaredMethod(ms.getName(),ms.getParameterTypes());
//1.3获取目标方法对象上注解中的属性值
//1.2.3 获取方法上的自定义requiredLog注解
RequiredLog requiredLog=targetMethod.getAnnotation(RequiredLog.class);
//1.2.4 获取自定义注解中operation属性的值
String operation=requiredLog.operation();
return null;
}
切面执行顺序
切面的优先级需要借助@Order注解进行描述,数字越小优先级越高,默认优先级比较低。
例如:定义日志切面并指定优先级。
@Order(1)
@Aspect
@Componentpublic class SysLogAspect {...}
定义缓存切面并指定优先级:
@Order(2)
@Aspect
@Componentpublic class SysCacheAspect{...}
通知类型
Spring框架AOP模块定义通知类型,有如下几种:
- @Around (优先级最高的通知,可以在目标方法执行之前,之后灵活进行业务拓展.)
- @Before (目标方法执行之前调用)
- @AfterReturning (目标方法正常结束时执行)
- @AfterThrowing (目标方法异常结束时执行)
- @After (目标方法结束时执行,正常结束和异常结束它都会执行)
说明:当多个切面作用于同一个目标对象方法时,这些切面会构建成一个切面链,类似过滤器链、拦截器链,其执行分析如图所示: