Spring Aop中解析spel表達式

在Spring Aop中,我們可以拿到攔截方法的參數(shù),如果能結(jié)合spel表達式峦剔,就能實現(xiàn)更加靈活的功能。典型的實現(xiàn)有Spring的緩存注解:

@Cacheable(value = "user", key = "#id", condition = "#id lt 10")
public User conditionFindById(final Long id) {
}

本文介紹如何在aop編程中解析spel表達式角钩,提供幾個通用的方法吝沫。

Spring使用自定義注解實現(xiàn)aop的方式這里就不贅述,只著重介紹如何解析spel

實現(xiàn)非常簡單递礼,Spring本身就提供了簡便的api惨险,我們只需要獲取:

  • 方法:Method method
  • 方法參數(shù):Object[] arguments
  • spel表達式:String spel

這些都能從aop入口方法的參數(shù)ProceedingJoinPoint中得到脊髓。
spel表達式顯然就是從自定義注解中獲取了辫愉,而獲取方法和參數(shù)的方式如下:

1、獲取方法

private Method getMethod(ProceedingJoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        if (method.getDeclaringClass().isInterface()) {
            try {
                method = joinPoint
                        .getTarget()
                        .getClass()
                        .getDeclaredMethod(joinPoint.getSignature().getName(),
                                method.getParameterTypes());
            } catch (SecurityException | NoSuchMethodException e) {
                throw new RuntimeException(e);
            }
        }
        return method;
    }

2将硝、獲取方法參數(shù)值

Object[] arguments = joinPoint.getArgs();

3恭朗、解析

private ExpressionParser parser = new SpelExpressionParser();

private LocalVariableTableParameterNameDiscoverer discoverer = new LocalVariableTableParameterNameDiscoverer();

4、根據(jù)spel表達式解析參數(shù)依疼,得到結(jié)果

    /**
     * 解析 spel 表達式
     *
     * @param method    方法
     * @param arguments 參數(shù)
     * @param spel      表達式
     * @param clazz     返回結(jié)果的類型
     * @param defaultResult 默認(rèn)結(jié)果
     * @return 執(zhí)行spel表達式后的結(jié)果
     */
    private <T> T parseSpel(Method method, Object[] arguments, String spel, Class<T> clazz, T defaultResult) {
        String[] params = discoverer.getParameterNames(method);
        EvaluationContext context = new StandardEvaluationContext();
        for (int len = 0; len < params.length; len++) {
            context.setVariable(params[len], arguments[len]);
        }
        try {
            Expression expression = parser.parseExpression(spel);
            return expression.getValue(context, clazz);
        } catch (Exception e) {
            return defaultResult;
        }
    }

總結(jié)

@Aspect
public class SpelAspect {

    private ExpressionParser parser = new SpelExpressionParser();
    private LocalVariableTableParameterNameDiscoverer discoverer = new LocalVariableTableParameterNameDiscoverer();
    
    @Around(value = "@annotation(自定義注解)")
    public Object test(ProceedingJoinPoint point) throws Throwable {
        Object obj;
        // 獲取方法參數(shù)值
        Object[] arguments = point.getArgs();
        // 獲取方法
        Method method = getMethod(point);
        // 從注解中獲取spel字符串痰腮,省略...
        String spel = ...
        // 解析spel表達式
        Boolean result = parseSpel(method, arguments, spel, Boolean.class, Boolean.FALSE);
        // 業(yè)務(wù)操作,省略...
        ...
        return point.proceed();
    }
}

*https://juejin.im/post/6844903782753501191#heading-0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涛贯,一起剝皮案震驚了整個濱河市诽嘉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌弟翘,老刑警劉巖虫腋,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異稀余,居然都是意外死亡悦冀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門睛琳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盒蟆,“玉大人踏烙,你說我怎么就攤上這事±龋” “怎么了讨惩?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長寒屯。 經(jīng)常有香客問我荐捻,道長,這世上最難降的妖魔是什么寡夹? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任处面,我火速辦了婚禮,結(jié)果婚禮上菩掏,老公的妹妹穿的比我還像新娘魂角。我一直安慰自己,他們只是感情好智绸,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布野揪。 她就那樣靜靜地躺著,像睡著了一般瞧栗。 火紅的嫁衣襯著肌膚如雪囱挑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天沼溜,我揣著相機與錄音,去河邊找鬼游添。 笑死系草,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的唆涝。 我是一名探鬼主播找都,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼廊酣!你這毒婦竟也來了能耻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤亡驰,失蹤者是張志新(化名)和其女友劉穎晓猛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凡辱,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡戒职,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了透乾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洪燥。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡磕秤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捧韵,到底是詐尸還是另有隱情市咆,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布再来,位于F島的核電站蒙兰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏其弊。R本人自食惡果不足惜癞己,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梭伐。 院中可真熱鬧痹雅,春花似錦、人聲如沸糊识。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赂苗。三九已至愉耙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拌滋,已是汗流浹背朴沿。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留败砂,地道東北人赌渣。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像昌犹,于是被迫代替她去往敵國和親坚芜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348