el表達式筆記及ognl

文章目錄

    • spel底層
      • spel核心代碼
        • TokenKind源碼
      • spel本地調試
    • spel示例
        • spel list例子
        • spel 對象例子
        • spel list例子
        • SimpleEvaluationContext 類找不到
          • ##### spel 如何表示包含(也就是like)?
        • spel官網文檔
      • ognl表達式
      • ognl和表達式語言的區別

這里重點說下SPEL(Spring Expression Language)。

spel底層

還是那句話,沒有誰想要研究底層,除非他遇到問題解不了。
個人就是這種情況,如:spel模糊匹配怎么弄?
文檔中的例子不一定全,簡單說就是比較概括,但是底層代碼卻是最完整的。

什么?看代碼太麻煩。恰恰相反,最復雜的就是最簡單的,看了看代碼,反而對spel的了解深入了些。

spel核心代碼

核心代碼在這里(表達式非模板,模板有另外的解析):
org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatExpression()

它的機制比較清楚。簡單說就是根據符號,進行解析

TokenKind源碼

這個枚舉類很關鍵,所有的表達式符號都在這里,所以不用去查是否支持了,看這個類就一目了然。

照搬源碼:

enum TokenKind {// ordered by priority - operands firstLITERAL_INT,LITERAL_LONG,LITERAL_HEXINT,LITERAL_HEXLONG,LITERAL_STRING,LITERAL_REAL,LITERAL_REAL_FLOAT,LPAREN("("),RPAREN(")"),COMMA(","),IDENTIFIER,COLON(":"),HASH("#"),RSQUARE("]"),LSQUARE("["),LCURLY("{"),RCURLY("}"),DOT("."),PLUS("+"),STAR("*"),MINUS("-"),SELECT_FIRST("^["),SELECT_LAST("$["),QMARK("?"),PROJECT("!["),DIV("/"),GE(">="),GT(">"),LE("<="),LT("<"),EQ("=="),NE("!="),MOD("%"),NOT("!"),ASSIGN("="),INSTANCEOF("instanceof"),MATCHES("matches"),BETWEEN("between"),SELECT("?["),POWER("^"),ELVIS("?:"),SAFE_NAVI("?."),BEAN_REF("@"),FACTORY_BEAN_REF("&"),SYMBOLIC_OR("||"),SYMBOLIC_AND("&&"),INC("++"),DEC("--");final char[] tokenChars;final private boolean hasPayload;  // is there more to this token than simply the kindprivate TokenKind(String tokenString) {this.tokenChars = tokenString.toCharArray();this.hasPayload = (this.tokenChars.length == 0);}private TokenKind() {this("");}@Overridepublic String toString() {return (name() + (this.tokenChars.length !=0 ? "(" + new String(this.tokenChars) +")" : ""));}public boolean hasPayload() {return this.hasPayload;}public int getLength() {return this.tokenChars.length;}}

spel本地調試

通過屬性注入的方式也不慢,但是還有更簡單的方式,就是本地直接調試,如在main方法里面。

不只一種方式可以配置環境變量,如:
1、StandardEvaluationContext

StandardEvaluationContext context = new StandardEvaluationContext();

2、EvaluationContext context(需要spring 4.3.15.RELEASE及以上)

EvaluationContext context = StandardEvaluationContext.forReadOnlyDataBinding().build();

后續示例,context哪個都可能啊。

spel示例

spel list例子
List<Integer> primes = new ArrayList<Integer>();
primes.addAll(Arrays.asList(2,3,5,7,11,13,17));
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable("primes",primes);
List<Integer> primesGreaterThanTen = (List<Integer>) parser.parseExpression("#primes.?[#this>10]").getValue(context);
System.out.println(JSON.toJSONString(primesGreaterThanTen));
spel 對象例子
 String usernmae =
(String) parser.parseExpression("#user.userName").getValue(context);
System.out.println(usernmae);
spel list例子

List primes = new ArrayList();
primes.addAll(Arrays.asList(2,3,5,7,11,13,17));
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable(“primes”,primes);
List primesGreaterThanTen = (List) parser.parseExpression(“#primes.?[#this>10]”).getValue(context);
System.out.println(JSON.toJSONString(primesGreaterThanTen));

SimpleEvaluationContext 類找不到

SimpleEvaluationContext was added in 4.3.15.RELEASE so the fact you can’t find it in 4.3.14.RELEASE is perfectly normal.
Spring Boot 1.5.13 uses Spring Framework 4.3.17.RELEASE.
由此可見,由于SimpleEvaluationContext 是4.3.15.RELEASE才增加的,只要把依賴的版本大于這個版本就行了。但由于官方推薦springBoot 1.5.13應該使用spring的4.3.17.RELEASE版本,那就把spring版本升級。

簡單說,就是SimpleEvaluationContext是4.3.15.RELEASE及以上版本才支持的。
升級下maven即可。

注:spring版本和release版本不是一回事。

##### spel 如何表示包含(也就是like)?

待辦

spel官網文檔

這里用5.3.18版本的吧,如下連接直接定位到spel。

https://docs.spring.io/spring-framework/docs/5.3.18/reference/html/core.html#expressions

ognl表達式

ognl表達式我們一定不陌生,可能會說沒聽說過,實際我們一直在用。
舉個最簡單的例子,spring的配置文件,其實就是ognl表達式。

spring.application.name=crm
server.port=8080

為什么要整理下呢?是因為遇到個問題,需要模糊匹配個值,居然不知道如何寫,難道真的啥也不會了?

ognl和表達式語言的區別

ognl最早出現在structs,需要和structs一起使用。
表達式語言則是個比較廣泛的概念,其中最出名的就是spring的(是spring的嗎?)el表達式。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40820.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40820.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40820.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

shark云原生-日志體系-filebeat高級配置(適用于生產)

文章目錄 1. filebeat.inputs 靜態日志收集器2. filebeat.autodiscover 自動發現2.1. autodiscover 和 inputs2.2. 如何配置1.2.1. Providers 提供者1.2.2. Providers kubernetes templates1.2.3. 基于提示&#xff08;hints&#xff09;的自動發現支持的 **hints**的完整列表&…

windows搭建mqtt服務器,并配置DTU收集傳感器數據

1.下載并安裝emqx服務器 參考&#xff1a;Windows系統下本地MQTT服務器搭建&#xff08;保姆級教程&#xff09;_mqtt windows-CSDN博客 這里我下載的是emqx-5.3.0-windows-amd64.zip版本 下載好之后&#xff0c;放到服務器的路徑&#xff0c;我這里放的地方是&#xff1a;C…

腦啟發設計:人工智能的進化之路

編者按&#xff1a;你可以用左手&#xff08;不常用的那只手&#xff09;的小指與食指拿起一件物品么&#xff1f; 試完你是不是發現自己竟然可以毫不費力地用自己不常用的手中&#xff0c;兩根使用頻率相對較低的手指&#xff0c;做一個不常做的動作。這就是人類大腦不可思議…

如何聲明一個類?類如何繼承?

要聲明一個類&#xff0c;需要使用關鍵字class&#xff0c;后面跟著類名。類名通常以大寫字母開頭。類的聲明通常包括類的成員變量和成員函數。 類可以通過繼承來擴展現有的類。要讓一個類繼承另一個類&#xff0c;需要使用冒號&#xff08;:&#xff09;并在后面跟著父類的名…

等保2.0中,云計算平臺如何做到數據的分類和加密?

數據分類 在等保2.0中&#xff0c;數據分類是確保數據安全的首要步驟。云計算平臺需要根據數據的敏感性和重要性進行分類&#xff0c;以便采取相應的保護措施。數據分類通常包括以下幾個步驟&#xff1a; 數據識別&#xff1a;識別出哪些數據是需要保護的&#xff0c;這可能包…

py黑帽子學習筆記_burp

配置burp kali虛機默認裝好了社區版burp和java&#xff0c;其他os需要手動裝 burp是用java&#xff0c;還得下載一個jython包&#xff0c;供burp用 配apt國內源&#xff0c;然后apt install jython --download-only&#xff0c;會只下載包而不安裝&#xff0c;下載的目錄搜一…

電子數據取證如何規范高效

文章關鍵詞&#xff1a;電子數據取證、現場勘驗、手機取證 隨著信息技術的迅猛發展和廣泛應用&#xff0c;電子數據作為一種獨立的法定證據形式&#xff0c;在執紀執法實踐中的作用愈加凸顯。規范、科學、高效的電子數據取證工作&#xff0c;不僅是保證電子數據符合法定要求、…

FreeRTOS LVGL頁面切換為LCD純手動繪制遇到的問題

有時候我們需要將FreeRTOS和LVGL頁面切換為LCD純手動繪制,提供更高的靈活性和可定制性。 自定義界面設計:使用LCD純手動繪制界面,可以完全自定義界面的外觀和行為。可以根據特定的需求和設計概念創建獨特的用戶界面,而不受LVGL框架的限制。 資源優化:LVGL是一個功能強大的…

9.x86游戲實戰-匯編指令mov

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 本次游戲沒法給 內容參考于&#xff1a;微塵網絡安全 工具下載&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

java實現多級菜單展示(遞歸)

實體類如下&#xff1a; package com.ssdl.baize.po;import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.annotations.ApiModel; import io.swagge…

cefsharp在splitContainer.Panel2中顯示調試工具DevTools(非彈出式)含源代碼

一、彈出式調試工具 (ShowDevTools) ChromiumWebBrowser webbrowser; public void showDevTools(){//定位到某元素webbrowser.ShowDevTools(null, parameters.XCoord, parameters.YCoord);

STM32智能農業監控系統教程

目錄 引言環境準備智能農業監控系統基礎代碼實現&#xff1a;實現智能農業監控系統 4.1 數據采集模塊 4.2 數據處理與分析 4.3 控制系統實現 4.4 用戶界面與數據可視化應用場景&#xff1a;農業監控與優化問題解決方案與優化收尾與總結 1. 引言 智能農業監控系統利用STM32嵌…

代碼隨想錄day37 動態規劃(3)

416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; 解1&#xff1a;二維dp數組&#xff0c;時間O(m*n)&#xff0c;空間O(m*n)&#xff0c;m、n為dp數組的行和列數。 判斷原數組總和能否整除2&#xff1b; 將target設為total // 2&#xff08;若是total / 2&#…

遇到的異步問題

事例1&#xff1a; app.post("/predictfunc") async def predictfunc(item: Item):# 使用asyncio.to_thread()在單獨的線程中運行predict_in_threadresult await asyncio.to_thread(predictfunc_main, item)return result 事例2&#xff1a; app.post("/remo…

PCL從理解到應用【02】PCL環境安裝 | PCL測試| Linux系統

前言 本文介紹在Ubuntu18.04系統中&#xff0c;如何安裝PCL。 源碼安裝方式&#xff1a;pcl版本1.91&#xff0c;vtk版本8.2.0&#xff0c;Ubuntu版本18.04。 安裝好后&#xff0c;可以看到pcl的庫&#xff0c;在/usr/lib/中&#xff1b; 通過編寫C代碼&#xff0c;直接調用…

華為路由器靜態路由配置(eNSP模擬實驗)

實驗目標 如圖下所示&#xff0c;讓PC1ping通PC2 具體操作 配置PC設備ip 先配置PC1的ip、掩碼、網關。PC2也做這樣的配置 配置路由器ip 配置G0/0/0的ip信息 #進入系統 <Huawei>system-view #進入GigabitEthernet0/0/0接口 [Huawei]int G0/0/0 #設置接口的ip和掩碼 […

【UE5.3】筆記7 控制Pawn移動

使用A、D鍵控制角色左右移動 打開我們的BP_Player藍圖類&#xff0c;選擇事件圖表&#xff0c;添加我們的控制事件 右鍵&#xff0c;搜索A keyboard&#xff0c;選擇A,如下圖&#xff0c;D也是 添加扭矩力 首先我們要把我們的player上的模擬物理選項打開&#xff0c;這樣我們…

ChatGPT在Java后端開發中的應用與影響

隨著人工智能技術的發展&#xff0c;尤其是OpenAI推出的聊天機器人模型ChatGPT&#xff0c;其強大的自然語言理解和生成能力正在改變著我們的生活和工作方式。在Java后端開發領域&#xff0c;ChatGPT同樣有著廣泛的應用前景&#xff0c;并且能夠為Java后端開發者帶來諸多好處。…

Caused by: java.io.IOException: Broken pipe

IO異常&#xff1a;管道破裂。 推薦文章&#xff1a;解決java.io.IOException: Broken pipe的報錯

JavaFx基礎知識

1.Stage 舞臺 如此這樣的一個框框&#xff0c;舞臺只是這個框框&#xff0c;并不管里面的內容 public void start(Stage primaryStage) throws Exception {primaryStage.setScene(new Scene(new Group()));primaryStage.getIcons().add(new Image("/icon/img.png"))…