一、表達式語言概述
Spring-Expression(簡稱SpEL)是一種表達式語言,可以用於很多領域,包括基於字元串的解析、安全性的限制、動態查詢、配置等等。SpEL在Spring框架中大量應用,比如在Spring MVC的請求映射、Spring Security的授權規則、Spring Data JPA的查詢條件等等。作為一個類似於腳本語言的語言,SpEL的特點在於簡單易學,表達能力強,可以完全替代傳統Java代碼。下面將從語法、功能模塊、應用示例等多個方面對SpEL進行詳細闡述。
二、語法概述
SpEL基本語法與常見腳本語言類似,包括表達式值、變數、方法調用、算術運算符、關係運算符、邏輯運算符、三元運算符、正則表達式等。具體語法如下:
${expression} #{expression} #variableName #{methodName(args)} +,-,*,/,% >,>=,<,<=,eq,ne and,or,not expression?trueValue:falseValue 'pattern'.matches(expression)
其中,${expression}表示從配置文件中獲取value,#{expression}表示在SpEL中直接計算表達式的值,#variableName表示從Spring容器中獲取變數的值,#{methodName(args)}表示調用Spring容器中的bean的方法,+,-,*,/,%,>,>=,<,<=,eq,ne表示算術、關係運算符,and,or,not表示邏輯運算符,expression?trueValue:falseValue表示三元運算符,'pattern'.matches(expression)表示正則表達式匹配。
三、核心功能模塊解析
3.1 屬性訪問
屬性訪問是SpEL最基本的功能,可以用於訪問對象、Map、List等數據結構的屬性。SpEL屬性訪問語法很簡單,使用”.”操作符即可。
Person person = new Person(); person.setName("Tony"); ExpressionParser parser = new SpelExpressionParser(); Expression expression = parser.parseExpression("name"); String name = (String) expression.getValue(person); // Tony
3.2 方法調用
方法調用是SpEL的另一個重要功能,SpEL中可以直接調用bean的方法,並且支持傳遞參數和使用返回值。SpEL方法調用語法使用”()”操作符,可以傳遞參數,多個參數使用”,”分隔。
public class HelloService { public String sayHello(String name) { return "Hello " + name; } } HelloService helloService = new HelloService(); ExpressionParser parser = new SpelExpressionParser(); Expression expression = parser.parseExpression("#helloService.sayHello('Tony')"); String str = (String) expression.getValue(new StandardEvaluationContext(helloService)); // Hello Tony
3.3 集合處理
SpEL支持對集合進行處理,包括List、Map等數據結構的訪問、過濾、投影等操作。SpEL中集合訪問語法使用”[]”操作符,如果要訪問Map,則使用”[‘key’]”的方式。
List personList = new ArrayList(); personList.add(new Person("Tony", 18)); personList.add(new Person("Tom", 19)); ExpressionParser parser = new SpelExpressionParser(); Expression expression = parser.parseExpression("![name]"); List names = (List) expression.getValue(personList); // [Tony, Tom] expression = parser.parseExpression("[name=='Tony']"); List person = (List) expression.getValue(personList); // [Person(name=Tony, age=18)]
3.4 條件判斷
SpEL支持各種邏輯運算符和比較運算符,同時也支持三元運算符。SpEL中條件判斷語句的語法很簡單,使用”?”和”:”實現三元運算符。
ExpressionParser parser = new SpelExpressionParser(); Expression expression = parser.parseExpression("age > 18 ? '成年' : '未成年'"); String result = (String) expression.getValue(new Person("Tony", 20)); // 成年
3.5 正則表達式
SpEL支持使用正則表達式進行匹配,同時還支持正則表達式的替換功能。
ExpressionParser parser = new SpelExpressionParser(); Expression expression = parser.parseExpression("'Tony 18'.replaceFirst('(\\\\d+)', '20')"); String result = (String) expression.getValue(); // Tony 20
四、應用示例
SpEL應用非常廣泛,在Spring框架中幾乎涵蓋了所有的模塊和子框架。下面簡單介紹一下SpEL在Spring MVC和Spring Security中的應用。
4.1 Spring MVC
在Spring MVC中,SpEL主要用於請求映射和數據綁定,可以方便地從請求參數中獲取值並進行類型轉換。
@RequestMapping("/hello") public String sayHello(@RequestParam("name") String name) { return "Hello " + name; }
4.2 Spring Security
在Spring Security中,SpEL主要用於授權規則的構建和判斷。可以根據用戶的角色和許可權進行自定義規則的配置。
@PreAuthorize("hasRole('ROLE_ADMIN') or hasPermission(#id, 'write')") public void modify(long id, String content) { // ... }
五、總結
Spring-Expression是一種簡單易學、高效便捷的表達式語言,在Spring框架的很多地方都有廣泛應用。SpEL基本語法包括屬性訪問、方法調用、集合處理、條件判斷、正則表達式等,支持多種類型數據的操作和處理。除此之外,SpEL的應用還涵蓋了Spring MVC、Spring Security等多個框架和模塊,可以幫助開發人員更加靈活和高效地進行編碼。
原創文章,作者:KIJEZ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/331878.html