# 表达式
Spring Expression Language(SpEL)是Spring向Spring社区提供的一种可独立、强大且支持良好的表达式语言,支持在运行时查询和操作对象。
SpEL官方依赖为:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
Fly主要在fly-core中拓展了功能,详细见下文,fly-core一般会随ORM、REST等模板间接引入:
<dependency>
<groupId>cn.openfuse</groupId>
<artifactId>fly-core</artifactId>
<version>${fly.version}</version>
</dependency>
# 表达式
SpEL提供了丰富的功能,在这里对常用功能作简单介绍。
# 字符串等类型
表达式值所属类型及其简单运算:
字符串:
'Hello World'、'Hello ' + 'World',表达式结果均为Hello World数值:
1、2 + 5 - 6,表达式结果均为 1布尔值:
!true,表达式结果为false
# 方法调用
对象方法:
'Hello World'.concat('!')静态方法:
T(fly.lang.generator.ShortUUID).randomUUID()构造方法:
new String('Hello World')、new int[]{1,2,3}
更多功能可见官网文档SpEL (opens new window)(Spring 5.3.9)。Fly包装了更多可访问对象来丰富SpEL的使用,如支持在表达式中通过vars全局变量来获取当前请求用户信息等,具体可查看全局变量。
# 使用方式
SpEL从表达式的解析到设置变量、获取值,官方示例参考如下:
Inventor tesla = new Inventor("Nikola Tesla", "Serbian"); // (name, nationality)
StandardEvaluationContext context = new StandardEvaluationContext(tesla);
context.setVariable("newName", "Mike Tesla");
Expression expression = parser.parseExpression("Name = #newName");
expression.getValue(context);
System.out.println(tesla.getName()) // "Mike Tesla"
在不需要像示例中修改对象属性的情况下,只希望存粹地执行表达式并返回值,可以使用Fly框架提供的ExpressionFactory来创建表达式并.getValue():
import fly.core.expression.ExpressionFactory;
...
@Autowired
protected ExpressionFactory expressionFactory;
public void test() {
Expression expression = expressionFactory.createExpression("#vars.now");
Instant now = (Instant) expression.getValue(); // 系统当前时间
}
...
该使用方式省略了创建context及设置variables的过程,经由框架管理,使得我们在表达式中可以更方便使用内置或自定义的variables,如示例中的vars,它更多使用方式可见全局变量。
在实体的字段定义注解及sql参数中,都可以使用表达式变量。
# 全局变量
全局变量表达式#vars.可获取实现了fly.core.variable.Variable接口的bean,对于由框架ExpressionFactory创建的表达式(包括实体字段定义注解中所有如expr可填表达式的属性等),可在任意时候执行调用。
# 内置变量
框架内置实现有:
#vars.currentTimeMillis/#vars.now
都是获取系统当前时间,只是返回类型有所不同,currentTimeMillis返回类型为long,now返回类型为Instant。
此外,当引入了Spring Security(即存在org.springframework.security.core.context.SecurityContextHolder类),可获取下列信息:
#vars.user
获取当前用户信息,信息类为:fly.core.security.userinfo.UserInfo。
#vars.user. | 说明 | 类型 |
|---|---|---|
id | 用户ID | Object |
name | 用户显示名称 | String |
username | 用户登录名称 | String |
anonymous | 是否为匿名用户 | boolean |
properties | 其他属性 | Map<String, Object> |
#vars.client
获取当前客户端信息,信息类为fly.core.security.clientinfo.ClientInfo。
#vars.client. | 说明 | 类型 |
|---|---|---|
id | 客户端ID | String |
appId | 客户端所属应用ID | String |
properties | 其他属性 | Map<String, Object> |
user、client返回类均实现了PropertiesGetter,若properties中存在如property1,可直接通过vars.user.property1表达式获取。
# 自定义变量
实现fly.core.variable.Variable接口,并注册为bean:
ExampleVariable.java:
import org.springframework.stereotype.Component;
import fly.core.variable.Variable;
public class ExampleVariable implements Variable {
@Override
public Object getValue() {
// 自定义
}
}
Application.java:
@Bean
@Qualifier("example") // 自定义命名,在表达式中使用
Variable exampleVariable() {
return new ExampleVariable();
}
最后使用方式为:#vars.example。