美文网首页
AOP注解方式动态获取方法参数

AOP注解方式动态获取方法参数

作者: 小方块886 | 来源:发表于2021-02-20 11:38 被阅读0次

    1.获取方法参数

        // 定义切点
        @Pointcut("@annotation(com.example.springbootredisson.annotation.Lock)")
        public void pointCut(){
        }
    
        @Around("pointCut()")
        public Object pointCut(ProceedingJoinPoint joinPoint){
            MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
            //获取注解参数值
            Lock lock = methodSignature.getMethod().getAnnotation(Lock.class);
            String prefix = lock.prefix();
            String spELString = lock.suffix();
            // 通过joinPoint获取被注解方法
            String value = generateKeyBySpEL(spELString, joinPoint);
            // 解析后的参数可以继续做后续增加业务处理 例:加锁
            // 执行业务逻辑
            return joinPoint.proceed();
        }
    

    2.解析SPEL中的表达式

            if(StringUtils.isBlank(spELString)){ 
                return null;
            }
            // 通过joinPoint获取被注解方法
            MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
            Method method = methodSignature.getMethod();
            //创建解析器
            SpelExpressionParser parser = new SpelExpressionParser();
            //获取表达式
            Expression expression = parser.parseExpression(spELString);
            //设置解析上下文(有哪些占位符,以及每种占位符的值)
            EvaluationContext context = new StandardEvaluationContext();
            //获取参数值
            Object[] args = joinPoint.getArgs();
            //获取运行时参数的名称
            DefaultParameterNameDiscoverer discoverer = new DefaultParameterNameDiscoverer();
            String[] parameterNames = discoverer.getParameterNames(method);
            for (int i = 0; i < parameterNames.length; i++) {
                context.setVariable(parameterNames[i],args[i]);
            }
            //解析,获取替换后的结果
            String result = expression.getValue(context).toString();
            System.out.println(result);
            return result;
    

    3.使用方法

        /**
         * get请求,解析请求头中的参数
         * @param orderId
         */
        @GetMapping("test")
        @Lock(prefix = "test",suffix = "#orderId")
        public void test(@RequestParam(value = "orderId") Integer orderId){
            System.out.println(orderId);
        }
    
        /**
         * post请求,解析请求体中的参数
         * @param id
         */
        @Lock(prefix = "test",suffix = "#user.id")
        @PostMapping("goods")
        public void goods(@RequestBody User user){
            System.out.println(user);
        }
    

    相关文章

      网友评论

          本文标题:AOP注解方式动态获取方法参数

          本文链接:https://www.haomeiwen.com/subject/alptfltx.html