例如要实现一个评论内容的拦截
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); } }
原文:https://www.cnblogs.com/cearnach/p/10487897.html