詳解Spring中Spel表達(dá)式和el表達(dá)式的區(qū)別
在翻看源碼的時(shí)候,看到項(xiàng)目里有人實(shí)現(xiàn)了緩存功能,這個(gè)緩存里面值的存放與獲取是通過一個(gè)路徑表達(dá)式來獲取的,而這個(gè)路徑表達(dá)式實(shí)際是基于對(duì)Spel表達(dá)式的一些封裝。出于對(duì)這個(gè)表達(dá)式的好奇,于是有了如下的,探索。
在 Java 開發(fā)中,表達(dá)式語言(Expression Language)是一種強(qiáng)大的工具,它允許我們?cè)谶\(yùn)行時(shí)動(dòng)態(tài)地計(jì)算和操作對(duì)象的屬性和方法。在 Spring 生態(tài)系統(tǒng)中,我們常常遇到兩種表達(dá)式語言:SpEL 表達(dá)式(Spring Expression Language Expression)和 EL 表達(dá)式(Expression Language Expression)。這兩種表達(dá)式都是為了解決 Java 開發(fā)中的靈活性和動(dòng)態(tài)性問題,但在實(shí)際應(yīng)用中有著不同的使用場(chǎng)景和功能。
1. EL 表達(dá)式
EL 表達(dá)式是 JavaEE 規(guī)范中定義的一種表達(dá)式語言,用于在 JSP、JSF 和其他 JavaEE 相關(guān)的技術(shù)中進(jìn)行頁面的數(shù)據(jù)綁定、表達(dá)式求值等。
EL 表達(dá)式使用 ${}
符號(hào)來引用屬性值,常用于獲取對(duì)象的屬性值、調(diào)用對(duì)象的方法以及進(jìn)行運(yùn)算。
示例:
// 定義一個(gè)對(duì)象 public class Person { private String name; private int age; // getters and setters } // 在 JSP 頁面中使用 EL 表達(dá)式獲取對(duì)象的屬性值 <p>Name: ${person.name}, Age: ${person.age}</p>
2. SpEL 表達(dá)式
SpEL 表達(dá)式是 Spring Framework 提供的一種表達(dá)式語言,用于在 Spring 應(yīng)用中進(jìn)行屬性引用、條件判斷、動(dòng)態(tài)計(jì)算等操作。
SpEL 表達(dá)式使用 #{}
符號(hào)來引用屬性值和進(jìn)行表達(dá)式計(jì)算,支持更豐富和強(qiáng)大的語法和功能。
SpEL 支持屬性、方法調(diào)用、運(yùn)算符、集合操作、條件判斷、正則表達(dá)式等更復(fù)雜的語法。還支持類型轉(zhuǎn)換、變量引用、集合投影等高級(jí)特性。
示例:
// 在 Spring 配置文件中使用 SpEL 表達(dá)式設(shè)置屬性值 <bean id="myBean" class="com.example.MyBean"> <property name="name" value="#{person.name}" /> <property name="age" value="#{person.age + 5}" /> </bean> // 動(dòng)態(tài)規(guī)則和條件判斷 @Service public class OrderService { @Value("#{orderValidator.validate(#order)}") private boolean isValid; public void processOrder(Order order) { if (isValid) { // 處理有效訂單 } else { // 處理無效訂單 } } }
3. SpEL 與 EL 表達(dá)式的區(qū)別
上下文:EL 表達(dá)式主要用于 JavaEE 環(huán)境中進(jìn)行頁面數(shù)據(jù)綁定,而 SpEL 表達(dá)式作為 Spring Framework 的一部分,用于 Spring 應(yīng)用中進(jìn)行屬性引用、條件判斷、動(dòng)態(tài)計(jì)算等操作。
功能和語法:SpEL 表達(dá)式相較于 EL 表達(dá)式更強(qiáng)大,支持更復(fù)雜的語法和功能,包括類型轉(zhuǎn)換、集合操作、正則表達(dá)式等。
引用方式:EL 表達(dá)式使用 ${}
符號(hào),而 SpEL 表達(dá)式使用 #{}
符號(hào)。這兩種符號(hào)在使用場(chǎng)景和功能上有所區(qū)別。
4. 發(fā)散與思考
表達(dá)式 Expression 對(duì)象實(shí)際上是一種樹狀結(jié)構(gòu),類似于 DOM(Document Object Model)樹。在解析 XML 文本時(shí),DOM 樹表示了整個(gè) XML 文檔的層次結(jié)構(gòu),允許我們對(duì) XML 文檔進(jìn)行遍歷和操作。
類似地,表達(dá)式在解析后通常被轉(zhuǎn)換為一種類似于抽象語法樹(AST)的樹狀結(jié)構(gòu)。這種樹狀結(jié)構(gòu)用于在運(yùn)行時(shí)表示表達(dá)式的結(jié)構(gòu),允許我們對(duì)表達(dá)式進(jìn)行求值和計(jì)算。
表達(dá)式的樹狀結(jié)構(gòu)由節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)代表表達(dá)式中的一個(gè)操作或操作數(shù)。節(jié)點(diǎn)之間通過連接關(guān)系構(gòu)成表達(dá)式的語法結(jié)構(gòu)。在 SpEL 或其他表達(dá)式語言中,解析過程將表達(dá)式字符串解析為這種樹狀結(jié)構(gòu),以便在運(yùn)行時(shí)進(jìn)行快速求值。
類似于 DOM 樹可以用于遍歷和操作 XML 文檔,表達(dá)式的樹狀結(jié)構(gòu)可以用于動(dòng)態(tài)計(jì)算和操作表達(dá)式。這種樹狀結(jié)構(gòu)允許開發(fā)人員在運(yùn)行時(shí)訪問表達(dá)式的組成部分,并根據(jù)具體的上下文進(jìn)行求值和計(jì)算,使得表達(dá)式具有更高級(jí)和更靈活的特性。
5. java中的樹狀結(jié)構(gòu)對(duì)象都有哪些
Java 中有許多樹狀結(jié)構(gòu)的對(duì)象,常見的包括但不限于:
DOM 樹:用于表示 XML 文檔的樹狀結(jié)構(gòu),在 Java 中通過各種 XML 解析器(如 javax.xml.parsers.DocumentBuilder)進(jìn)行解析和操作。
Abstract Syntax Tree (AST):抽象語法樹,通常用于表示編程語言中的代碼結(jié)構(gòu),在編譯器和解釋器中廣泛使用。
文件系統(tǒng)樹:用于表示計(jì)算機(jī)文件系統(tǒng)的層次結(jié)構(gòu),Java 中可以通過 java.nio.file.Path 類來表示文件和目錄的路徑。
GUI 組件樹:用于表示圖形用戶界面的組件層次結(jié)構(gòu),在 Java Swing 和 JavaFX 中都有對(duì)應(yīng)的樹狀結(jié)構(gòu)表示。
集合框架中的樹集合:Java 提供了 java.util.TreeSet 和 java.util.TreeMap 等樹集合,用于存儲(chǔ)有序的元素。
5.1 樹狀結(jié)構(gòu)的優(yōu)勢(shì)和特點(diǎn)包括
- 層次性:樹狀結(jié)構(gòu)的最大特點(diǎn)是具有層次性,它由節(jié)點(diǎn)和邊構(gòu)成,節(jié)點(diǎn)之間通過連接關(guān)系形成層次結(jié)構(gòu),從而形成了樹的層次性。這種結(jié)構(gòu)非常適合表示層級(jí)關(guān)系和嵌套結(jié)構(gòu)的數(shù)據(jù)。
- 快速查找:樹狀結(jié)構(gòu)支持快速查找和訪問數(shù)據(jù)。根據(jù)根節(jié)點(diǎn)和子節(jié)點(diǎn)之間的連接關(guān)系,可以在樹中快速定位目標(biāo)節(jié)點(diǎn),從而提高數(shù)據(jù)查找的效率。
- 插入和刪除效率高:樹狀結(jié)構(gòu)在插入和刪除數(shù)據(jù)時(shí)通常具有較高的效率。由于節(jié)點(diǎn)之間的連接關(guān)系,插入和刪除操作通常只需要對(duì)有限的節(jié)點(diǎn)進(jìn)行操作,而不會(huì)影響整個(gè)數(shù)據(jù)集。
- 有序性:在某些樹狀結(jié)構(gòu)中,節(jié)點(diǎn)的排列是有序的,這使得樹可以很容易地實(shí)現(xiàn)有序的遍歷和查詢。
5.2 樹狀結(jié)構(gòu)的用途
- 表示層次關(guān)系:樹狀結(jié)構(gòu)非常適合表示具有層次關(guān)系的數(shù)據(jù),如文件系統(tǒng)的目錄結(jié)構(gòu)、組織架構(gòu)等。
- 數(shù)據(jù)檢索:樹狀結(jié)構(gòu)可以用于構(gòu)建索引,以提高數(shù)據(jù)的檢索效率。例如,在數(shù)據(jù)庫中使用 B 樹來加速數(shù)據(jù)查詢。
- 編程語言解析:在編譯器和解釋器中,通常會(huì)使用抽象語法樹(AST)來表示程序代碼的結(jié)構(gòu),便于編譯和執(zhí)行。
- 圖形用戶界面:GUI 組件樹用于表示圖形用戶界面的組件層次結(jié)構(gòu),方便布局和事件處理。
小結(jié):
SpEL 表達(dá)式和 EL 表達(dá)式都是 Java 開發(fā)中非常有用的表達(dá)式語言,它們都解決了動(dòng)態(tài)計(jì)算和操作對(duì)象的需求。EL 表達(dá)式主要用于 JavaEE 環(huán)境的頁面數(shù)據(jù)綁定,而 SpEL 表達(dá)式則在 Spring 應(yīng)用中廣泛應(yīng)用于屬性引用、條件判斷、動(dòng)態(tài)規(guī)則定義等。通過學(xué)習(xí)和使用這兩種表達(dá)式語言,我們可以使應(yīng)用程序更具靈活性和可配置性,提高開發(fā)效率,并使代碼更易于維護(hù)和擴(kuò)展。根據(jù)實(shí)際的開發(fā)需求和使用場(chǎng)景,我們可以選擇合適的表達(dá)式語言來滿足不同的需求。
到此這篇關(guān)于詳解Spring中Spel表達(dá)式和el表達(dá)式的區(qū)別的文章就介紹到這了,更多相關(guān)Spring表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring中@Value使用詳解及SPEL表達(dá)式
- SpringDataElasticsearch與SpEL表達(dá)式實(shí)現(xiàn)ES動(dòng)態(tài)索引
- Spring AOP如何在注解上使用SPEL表達(dá)式注入對(duì)象
- spring之SpEL表達(dá)式詳解
- 使用Springboot自定義注解,支持SPEL表達(dá)式
- 基于spring?@Cacheable?注解的spel表達(dá)式解析執(zhí)行邏輯
- Spring?Cache抽象-使用SpEL表達(dá)式解析
- Spring實(shí)戰(zhàn)之Bean定義中的SpEL表達(dá)式語言支持操作示例
- Spring組件開發(fā)模式支持SPEL表達(dá)式
- Spring spel表達(dá)式使用方法示例
- Spring中SpEL表達(dá)式的使用全解
相關(guān)文章
關(guān)于IDEA報(bào)錯(cuò)Error:java 不支持發(fā)行版本17的原因及解決方案
在rebuild或運(yùn)行項(xiàng)目時(shí)提示“Error:java: 錯(cuò)誤: 不支持發(fā)行版本 17”,本文將給大家介紹了IDEA提示“Error:java: 錯(cuò)誤: 不支持發(fā)行版本17”的原因及解決方案,需要的朋友可以參考下2023-09-09Spring集成MyBatis?及Aop分頁的實(shí)現(xiàn)代碼
這篇文章主要介紹了Spring集成MyBatis?及Aop分頁的實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04Java8處理集合的優(yōu)雅姿勢(shì)之Stream
這篇文章主要給大家介紹了關(guān)于Java8優(yōu)雅處理集合之Stream的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用java8具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03在Window系統(tǒng)下安裝Netbeans9的方法
今天小編就為大家分享一篇關(guān)于在Window系統(tǒng)下安裝Netbeans9的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12Spring AOP如何自定義注解實(shí)現(xiàn)審計(jì)或日志記錄(完整代碼)
這篇文章主要介紹了Spring AOP如何自定義注解實(shí)現(xiàn)審計(jì)或日志記錄(完整代碼),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12spring boot使用自定義的線程池執(zhí)行Async任務(wù)
這篇文章主要介紹了spring boot使用自定義的線程池執(zhí)行Async任務(wù)的相關(guān)資料,需要的朋友可以參考下2018-02-02