SpEL表达式不同场景下的使用
SpEL表达式是非常强大的,在不同的场景下有不同的使用方式,下面一起看看它的使用方法
一、文字表达
支持的文字表达式的类型是字符串,数值(int,real,hex),布尔值和null。字符串由单引号分隔。要将单引号本身放入字符串中,请使用两个单引号字符。
下面的清单显示了文字的简单用法。通常,它们不会像这样孤立地使用,而是作为更复杂表达式的一部分,例如在逻辑比较运算符的一侧使用文字。
ExpressionParser parser = new SpelExpressionParser();
// evals to "Hello World"
String helloWorld = (String) parser.parseExpression("'Hello World'").getValue();
double avogadrosNumber = (Double) parser.parseExpression("6.0221415E+23").getValue();
// evals to 2147483647
int maxValue = (Integer) parser.parseExpression("0x7FFFFFFF").getValue();
boolean trueValue = (Boolean) parser.parseExpression("true").getValue();
Object nullValue = parser.parseExpression("null").getValue();
数字支持使用负号,指数表示法和小数点。默认情况下,实数使用Double.parseDouble()进行分析。
二、Properties, Arrays, Lists, Maps, Indexers
使用属性引用进行浏览很容易:只需使用句点来指示嵌套的属性值。Inventor类,pupin和tesla 的实例中填入了示例中使用的Classes一节中列出的数据。为了“向下”导航并获得特斯拉的出生年份和普平的出生城市,使用了以下表达式。
// evals to 1856
int year = (Integer) parser.parseExpression("Birthdate.Year + 1900").getValue(context);
String city = (String) parser.parseExpression("placeOfBirth.City").getValue(context);
对于属性名称的第一个字母,不区分大小写。数组和列表的内容使用方括号表示法获得。
ExpressionParser parser = new SpelExpressionParser();
EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();
// Inventions Array
// evaluates to "Induction motor"
String invention = parser.parseExpression("inventions[3]").getValue(
context, tesla, String.class);
// Members List
// evaluates to "Nikola Tesla"
String name = parser.parseExpression("Members[0].Name").getValue(
context, ieee, String.class);
// List and Array navigation
// evaluates to "Wireless communication"
String invention = parser.parseExpression("Members[0].Inventions[6]").getValue(
context, ieee, String.class);
通过指定括号内的文字键值来获得映射的内容。在这种情况下,因为Officer的Map的键是字符串,所以我们可以指定字符串文字。
// Officer's Dictionary
Inventor pupin = parser.parseExpression("Officers['president']").getValue(
societyContext, Inventor.class);
// evaluates to "Idvor"
String city = parser.parseExpression("Officers['president'].PlaceOfBirth.City").getValue(
societyContext, String.class);
// setting values
parser.parseExpression("Officers['advisors'][0].PlaceOfBirth.Country").setValue(
societyContext, "Croatia");
三、Inline lists
列表可以用{}符号表达式直接表达。
// evaluates to a Java list containing the four numbers
List numbers = (List) parser.parseExpression("{1,2,3,4}").getValue(context);
List listOfLists = (List) parser.parseExpression("{
{'a','b'},{'x','y'}}").getValue(context);
{}本身意味着一个空的列表。出于性能原因,如果列表本身完全由固定文字组成,则会创建一个常量列表来表示表达式,而不是在每个评估中创建一个新列表。
四、 Inline Maps
map也可以用{key:value}符号表达式直接表达。
// evaluates to a Java map containing the two entries
Map inventorInfo = (Map) parser.parseExpression("{name:'Nikola',dob:'10-July-1856'}").getValue(context);
Map mapOfMaps = (Map) parser.parseExpression("{name:{first:'Nikola',last:'Tesla'},dob:{day:10,month:'July',year:1856}}").getValue(context);
{:}本身就意味着一张空白的地图。出于性能原因,如果地图本身由固定文字或其他嵌套常量结构(列表或地图)组成,则将创建常量地图来表示表达式,而不是在每次评估中构建新地图。引用地图键是可选的,上面的例子没有使用带引号的键。
五、Array construction
可以使用熟悉的Java语法构建数组,可以选择提供初始化程序以在构建时填充数组。
int[] numbers1 = (int[]) parser.parseExpression("new int[4]").getValue(context);
// Array with initializer
int[] numbers2 = (int[]) parser.parseExpression("new int[]{1,2,3}").getValue(context);
// Multi dimensional array
int[][] numbers3 = (int[][]) parser.parseExpression("new int[4][5]").getValue(context)
在构建多维数组时,目前不允许提供初始化程序。
六、方法
使用典型的Java编程语法调用方法。你也可以在文字上调用方法。可变参数也被支持。
// string literal, evaluates to "bc"
String bc = parser.parseExpression("'abc'.substring(1, 3)").getValue(String.class);
// evaluates to true
boolean isMember = parser.parseExpression("isMember('Mihajlo Pupin')").getValue(
societyContext, Boolean.class);
七、操作符号
1.关系运算符
关系运算符; 相等,不等于,小于,小于或等于,大于,大于或等于支持使用标准的操作符表示法。
// evaluates to true
boolean trueValue = parser.parseExpression("2 == 2").getValue(Boolean.class);
// evaluates to false
boolean falseValue = parser.parseExpression("2 < -5.0")