通过切面AOP获取目标方法上自定义注解中的内容(详解!)

@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 (目标方法结束时执行,正常结束和异常结束它都会执行)
    在这里插入图片描述
    说明:当多个切面作用于同一个目标对象方法时,这些切面会构建成一个切面链,类似过滤器链、拦截器链,其执行分析如图所示:
    在这里插入图片描述
  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值