1. 程式人生 > >Spring-表達式語言

Spring-表達式語言

struts contex img bsp temp between 運行時 rri 圖片

概念及作用

Spring表達式語言全稱為“Spring Expression Language”,縮寫為“SPEL”,類似於Struts2x中使用的OGNL表達式語言,能在運行時構建復雜表達式、存取對象圖屬性對象方法調用 等等,並且能與Spring功能完美整合,如能用來配置Bean定義。

表達式語言給靜態Java語言增加了動態功能。

SPEL是單獨模塊,只依賴於core模塊,不依賴於其他模塊,可以單獨使用。

支持形式(不區分大小寫):

一、基本表達式:字面量表達式、關系,邏輯與算數運算表達式、字符串連接及截取表達式、三目運算及Elivis表達式、正則表達式、括號優先級表達式;

二、類相關表達式:

類類型表達式、類實例化、instanceof表達式、變量定義及引用、賦值表達式、自定義函數、對象屬性存取及安全導航表達式、對象方法調用、Bean引用;

三、集合相關表達式:內聯List、內聯數組、集合,字典訪問、列表,字典,數組修改、集合投影、集合選擇;不支持多維內聯數組初始化;不支持內聯字典定義;

四、其他表達式:模板表達式。

測試實例:

public class SpelTest {
@Test
public void spelTest(){
ExpressionParser expressionParser = new SpelExpressionParser();
ParserContext parserContext = new ParserContext() {
@Override
public boolean isTemplate() {
return true;
}

@Override
public String getExpressionPrefix() { //前綴表達式
return "#{";
}

@Override
public String getExpressionSuffix() { //後綴表達式
return "}";
}
};
String template = "#{‘Hello ‘}#{‘abl ‘}#{‘World!‘}"; //表達式
Expression expression = expressionParser.parseExpression(template, parserContext);
//註 必須完全匹配
Assert.assertEquals("Hello abl World!", expression.getValue());
}
}
註:默認傳入的字符串表達式不是模板形式

2)EvaluationContext接口: 表示上下文環境,默認實現是org.springframework.expression.spel.support包中的 StandardEvaluationContext類,使用setRootObject方法來設置根對象,使用setVariable方法來註冊自定義 變量,使用registerFunction來註冊自定義函數等等。

技術分享圖片

3)Expression接口:表示表達式對象,默認實現是org.springframework.expression.spel.standard包中的SpelExpression,提供getValue方法用於獲取表達式值,提供setValue方法用於設置對象值。

技術分享圖片

SpEL語法:

String str1 = parser.parseExpression("‘Hello World!‘").getValue(String.class);

String str2 = parser.parseExpression("\"Hello World!\"").getValue(String.class);

加減乘除

int result1 = parser.parseExpression("1+2-3*4/2").getValue(Integer.class);//-3

關系表達

等 於(==)、不等於(!=)、大於(>)、大於等於(>=)、小於(<)、小於等於(<=),區間(between)運算

邏輯表達式:

且(and)、或(or)、非(!或NOT)。

String expression2 = "2>1 and (NOT true or NOT false)"; 
boolean result2 = parser.parseExpression(expression2).getValue(boolean.class); Assert.assertEquals(true, result2);

字符串連接及截取表達式:使用“+”進行字符串連接

三目運算符 “表達式1?表達式2:表達式3用於構造三目運算表達式,如“2>1?true:false”將返回true;

正則表達式:使用“str matches regex,如“‘123‘ matches ‘\\d{3}‘”將返回true;

括號優先級表達式:使用“(表達式)”構造,括號裏的具有高優先級。

類相關表達式

這塊東西實在太枯燥了,沒有意思,不寫了

Spring-表達式語言