1. 程式人生 > >Spring AOP 結合自定義註解的使用

Spring AOP 結合自定義註解的使用

for img support bsp parser disco get asp src

例如要實現一個評論內容的攔截

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);
    }
}

Spring AOP 結合自定義註解的使用