zoukankan      html  css  js  c++  java
  • Spring AOP 结合自定义注解的使用

    例如要实现一个评论内容的拦截

    1,声明自定义注解,这里的key()为要拦截的方法中的方法体对应的变量名,可以参考第3点.

    2,创建一个切面类,@annatation()中的comment 为方法参数体中的注解对应的变量名

     3,在要拦截的方法上加入定义好的注解,其中#comment使用的是spel表达式.

     

    Spel表达式工具类:

    package club.ruanx.util;
    
    import org.springframework.expression.spel.standard.SpelExpression;
    import org.springframework.expression.spel.standard.SpelExpressionParser;
    import org.springframework.expression.spel.support.StandardEvaluationContext;
    import org.springframework.util.StringUtils;
    
    /**
     * Spel表达式工具类
     *
     * @author 阮胜
     * @date 2018/12/20 20:36
     */
    public class SpelUtils {
    
        /**
         * 解析Spel表达式
         * 例如: SpelUtils.parseExpression("'Hello '+#msg", new String[]{"msg"}, new Object[]{"World"});
         * 其中 #msg是变量,把对应的参数列表的值依次填充到各个变量中
         *
         * @param expression     表达式
         * @param parameterNames 参数名称
         * @param args           参数值
         * @return 解析后的表达式
         */
        public static String parseExpression(String expression, String[] parameterNames, Object[] args) {
            if (StringUtils.isEmpty(expression) || parameterNames == null || args == null
                    || parameterNames.length != args.length) {
                return expression;
            }
            SpelExpression spelExpression = new SpelExpressionParser().parseRaw(expression);
            StandardEvaluationContext evaluationContext = new StandardEvaluationContext();
            for (int i = 0; i < parameterNames.length; i++) {
                evaluationContext.setVariable(parameterNames[i], args[i]);
            }
            spelExpression.setEvaluationContext(evaluationContext);
            return spelExpression.getValue(String.class);
        }
    }

    切面工具类:

    package club.ruanx.util;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.reflect.MethodSignature;
    import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
    
    import java.lang.reflect.Method;
    
    /**
     * @author 阮胜
     * @date 2018/12/20 20:30
     */
    public class AspectUtils {
    
        /**
         * 根据切入点获取方法的形参列表
         *
         * @param joinPoint 切入点
         * @return 形参列表
         */
        public static String[] getMethodParamNames(JoinPoint joinPoint) {
            Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
            return getMethodParamNames(method);
        }
    
        /**
         * 根据方法获取形参列表
         *
         * @param method 方法
         * @return 形参列表
         */
        public static String[] getMethodParamNames(Method method) {
            return new LocalVariableTableParameterNameDiscoverer().getParameterNames(method);
        }
    }
  • 相关阅读:
    VHD进阶:差分VHD备份系统
    默认系统为UEFI启动的GPT分区的WIN7(8),如何安装VHD的UEFI WIN8(7)
    在WIN7/8下把XP装入VHD (上)
    USB鼠标线序
    组合与继承
    结构体内存对齐
    多媒体编码与格式
    网络病毒
    寄存器
    0
  • 原文地址:https://www.cnblogs.com/cearnach/p/10487897.html
Copyright © 2011-2022 走看看