# 表达式

Spring Expression Language(SpEL)SpringSpring社区提供的一种可独立、强大且支持良好的表达式语言,支持在运行时查询和操作对象。

SpEL官方依赖为:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>${spring.version}</version>
</dependency>

Fly主要在fly-core中拓展了功能,详细见下文,fly-core一般会随ORMREST等模板间接引入:

<dependency>
    <groupId>cn.openfuse</groupId>
    <artifactId>fly-core</artifactId>
    <version>${fly.version}</version>
</dependency>

# 表达式

SpEL提供了丰富的功能,在这里对常用功能作简单介绍。

# 字符串等类型

表达式值所属类型及其简单运算:

  • 字符串:'Hello World''Hello ' + 'World',表达式结果均为Hello World

  • 数值:12 + 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返回类型为longnow返回类型为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>

userclient返回类均实现了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

顶部