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

