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

2021-02-20  本文已影响0人  小方块886

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);
    }
上一篇下一篇

猜你喜欢

热点阅读