Spring表达式语⾔(SpEL)
Spring也有⾃⼰的EL,叫Spring Expression Language,简称SpEl。其可以在程序中单独使⽤,也可以在Spring应⽤中进⾏bean定义时使⽤。其核⼼是pression.Expression接⼝,Spring使⽤该接⼝来表⽰EL中的表达式。通过Expression接⼝的系列getValue()⽅法我们可以获取对应Expression在特定EvaluationContext下的值,也可以通过其系列setValue()⽅法来设值。对应的Expression通常不是由我们直接来new对应实现类的实例,⽽是通过Spring提供的pression.ExpressionParser接⼝的系列parseExpression()⽅法来将⼀个字符串类型的表达式解析为⼀个Expression。以下是⼀个简单的⽰例,在该⽰例中我们将字符串表达
式“1+2”解析为⼀个Expression,然后进⾏计算得出其值为3。
String expressionStr = "1+2";
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression(expressionStr);
Integer val = Value(Integer.class);
System.out.println(expressionStr + "的结果是:" + val);
最终输出:1+2的结果是:3
Expression接⼝有⼀系列的getValue()⽅法,当其不接收任何参数时表⽰将会把Expression的计算结果当做⼀个Object进⾏返回,如果我们希望返回的是特定的类型,则可以传递对应的类型作为getValue()⽅法的参数,如上述⽰例中传递的Interger.class。我们也可以通过给Expression的getValue()⽅法传递EvaluationContext⽤以获取在特定环境下的计算结果,也可以传递⼀个Object作为Expression计算的rootObject。
SpEL⽀持的表达式语法有:
⽂本表达式
对象属性表达式
数组、List 和 Map 表达式
⽅法表达式
操作符表达式
安全导航操作符
三元操作符
Elvis 操作符
赋值表达式
类型操作符
创建对象操作符
变量表达式
集合选择表达式
集合元素布尔判断
⽂本表达式⽀持字符串、数字(正数、实数及⼗六进制数)、布尔类型及null。其中的字符表达式可使⽤单引号来表⽰,形如:'Deniro'。如果表达式中包含单引号或者双引号字符,那么可以使⽤转义字符 \。
数字⽀持负数、⼩数、科学记数法、⼋进制数和⼗六进制数。默认情况下,实数使⽤Double.parseDouble()进⾏表达式类型转换。
ExpressionParser parser = new SpelExpressionParser();
//字符串解析, 写成“Hello World”会报错。
String str = (String) parser.parseExpression("'Hello World'").getValue();
System.out.println(str);
//整型解析
int intVal = (Integer) parser.parseExpression("0x2F").getValue();
System.out.println(intVal);
//双精度浮点型解析
double doubleVal = (Double) parser.parseExpression("4329759E+22").getValue(); System.out.println(doubleVal);
//布尔型解析
boolean booleanVal = (boolean) parser.parseExpression("true").getValue();
System.out.println(booleanVal);
在 SpEL 中,我们可以使⽤对象属性路径(形如类名.属性名.属性名)来访问对象属性的值。假设有⼀个账号类,Account.java:
private String name;
private int footballCount;
private Friend friend;
private List<Friend> friends;
public Account(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setFootballCount(int footballCount) {
this.footballCount = footballCount;
}
public int getFootballCount() {
return footballCount;
}
public void setFriends(List<Friend> friends) {
this.friends = friends;
}
public List<Friend> getFriends() {
return friends;
}
public void setFriend(Friend friend) {
this.friend = friend;
}
public Friend getFriend() {
return friend;
}
}
它包含姓名 name、⾜球数 footballCount 和⼀个朋友 friend 属性。friend 属性是⼀个 Friend 类:
private String name;
public Friend(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
解析属性对象表达式
//初始化对象
Account account=new Account("Deniro");
account.setFootballCount(10);
account.addFriend(new Friend("Jack"));
//解析器
ExpressionParser parser
= new SpelExpressionParser();
//解析上下⽂
hello spring是什么意思
EvaluationContext context=new StandardEvaluationContext(account);
//获取不同类型的属性
String name= (String) parser.parseExpression("Name").getValue(context);
System.out.println(name);
int count= (Integer) parser.parseExpression("footballCount+1").getValue(context);
System.out.println(count);
//获取嵌套类中的属性
String friend= (String) parser.parseExpression("friend.name").getValue(context);
System.out.println(friend);
总结:
SpEL 解析器适应⼒强,属性名⾸字母⼤⼩写均可。
解析对象表达式时,需要传⼊ EvaluationContext 上下⽂参数。
数组表达式⽀持 Java 创建数组的语法,形如 new int[]{3,4,5},数组项之间以逗号作为分隔符。
注意:⽬前还不⽀持多维数组。Map 表达式以键值对的⽅式来定义,形如 {name:'deniro',footballCount:10}。
//解析器
ExpressionParser parser = new SpelExpressionParser();
//解析⼀维数组
int[] oneArray = (int[]) parser.parseExpression("new int[]{3,4,5}").getValue();
System.out.println("⼀维数组开始:");
for (int i : oneArray) {
System.out.println(i);
}
System.out.println("⼀维数组结束");
//这⾥会抛出 SpelParseException
//int[][] twoArray = (int[][]) parser.parseExpression("new int[][]{3,4,5}{3,4,5}")
//        .getValue();
//解析 list
List list = (List) parser.parseExpression("{3,4,5}").getValue();
System.out.println("list:" + list);
//解析 Map
Map map = (Map) parser.parseExpression("{account:'deniro',footballCount:10}")
.getValue();
System.out.println("map:" + map);
//解析对象中的 list
final Account account = new Account("Deniro");
Friend friend1 = new Friend("Jack");
Friend friend2 = new Friend("Rose");
List<Friend> friends = new ArrayList<>();
friends.add(friend1);
friends.add(friend2);
account.setFriends(friends);
EvaluationContext context = new StandardEvaluationContext(account);
String friendName = (String) parser.parseExpression("friends[0].name")
.
getValue(context);
System.out.println("friendName:" + friendName);
从数组与 List 获取值,可以在括号内指定索引来获取,形如上例中的friends[0]。Map 中可通过键名来获取,形如xxx['xxx']。
SpEL ⽀持调⽤有访问权限的⽅法,这些⽅法包括对象⽅法、静态⽅法,⽽且⽀持可变⽅法参数。除此之外,还可以调⽤ String 类型中的所有可访问⽅法,⽐如ains('xxx')。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。