Solon Expression Language (SnEL):轻量高效的 Java 表达式引擎


一、SnEL 是什么?

Solon Expression Language(简称SnEL)是 Solon 生态体系中的轻量级表达式引擎,专为Java开发者设计。它采用独特的"求值表达式"模型,通过简洁的语法实现复杂逻辑处理,同时保持极高的执行效率和安全性。

项目地址:

  • Gitee: https://gitee.com/noear/solon-expression
  • GitHub: https://github.com/noear/solon-expression

二、核心特性解析

1. 安全可靠的表达式引擎

  • 无副作用设计:禁止new实例化、控制语句等危险操作
  • 上下文隔离:通过StandardContext严格管控变量访问范围

2. 丰富的表达式能力

// 复杂逻辑表达式示例
String expr = """
((age > 18 AND salary < 5000) OR NOT isMarried) 
AND tags IN ['vip','premium'] 
OR level == 'gold'""";

支持功能主要包括:

  • 基础运算:算术、比较、逻辑运算
  • 集合操作:IN/NOT IN集合判断
  • 嵌套访问:多级对象属性/方法调用
  • 静态方法:直接调用类静态方法
  • 三元运算:条件表达式支持

更多参考官网:《SnEL 求值表达式语法和能力说明》

3. 独创的模板引擎

双模式模板处理:

// 求值表达式模板
SnEL.evalTmpl("订单总额:#{order.amount * 0.95}");

// 属性表达式模板(带默认值)
SnEL.evalTmpl("配置参数:${server.timeout:3000}");

三、企业级功能深度解析

1. 上下文增强方案

// 标准Map上下文
Map<String,Object> ctx = new HashMap<>();
ctx.put("user", userService.getCurrent());

// 增强型Bean上下文
StandardContext context = new StandardContext(userEntity);
context.properties(configProps); // 绑定配置属性

// 虚拟root访问
SnEL.eval("root.id > 1000", context);

2. 多场景表达式转换

基于AST的通用转换接口:

Expression expr = SnEL.parse("age > 18 AND status=='active'");

// 转换为Redis查询语法
String redisFilter = RedisFilterTransformer.getInstance().transform(expr);

// 转换为Elasticsearch DSL
Map<String,Object> esQuery = ElasticsearchFilterTransformer.getInstance().transform(expr);

// 输出语法树结构
PrintUtil.printTree(expr);
转换器类型 输出示例 应用场景
Redis (@age:[18 +inf] @status:{active}) 缓存查询
Milvus ((metadata["age"] > 18) and (metadata["status"] == "active")) 向量数据库
Elasticsearch {bool={must=[{range={age={gt=18}}}, {term={status={value=active}}}]}} 全文检索
SQL WHERE age > 18 AND status='active' 数据库查询

四、典型应用场景

  • 动态规则引擎:金融风控规则配置
  • 智能路由:微服务调用条件路由
  • 低代码平台:表单校验逻辑动态配置
  • 数据分析:实时数据过滤与计算

五、快速入门

1. 添加依赖

<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-expression</artifactId>
<version>最新版本</version>
</dependency>

2. 基础用法示例

public class Demo {
public static void main(String[] args) {
Map<String,Object> context = new HashMap<>();
context.put("price", 99.5);
context.put("discount", 0.8);

Object result = SnEL.eval("price * discount > 50", context);
System.out.println("是否符合条件:" + result);
}
}

3. 性能优化建议

  • 复用解析结果:对固定表达式使用 SnEL.parse() 缓存 AST
  • 上下文优化:复杂对象优先使用 StandardContext
  • 避免频繁解析:高并发场景预编译表达式

六、企业实践案例

案例1:电商促销系统

// 动态计算促销条件
String rule = """
(user.level IN ['VIP','SVIP'] OR order.amount > 1000) 
AND inventory.stock > 0 
AND NOT blacklist.contains(user.id)""";

Boolean rst = SnEL.eval(rule, context);

相關推薦

2025-03-28

发支持(Solon AI 同时支持 java8 到 java24)。 新增 solon-expression 插件 新增 solon-security-web 插件 新增 solon-ai-load-ppt 插件,添加对 ppt, pptx 文档的解析 新增 solon-ai-load-word 插件,添加对 doc, docx 文档的解析 新增 solon-ai-repo-qdran

2024-08-29

擎自带流程图,可在不集成流程设计器情况下使用 条件表达式:内置常见的条件表达式,并且支持自定义扩展 orm框架扩展:目前支持MyBatis、Mybatis-Plus、Mybatis-Flex和Jpa,后续会由社区提供其他支持,扩展方便 数据库支持:

2025-05-24

设计 Solon AI 开放接口,和适配机制 2025-03 中 Solon Expression 项目启动 为 Solon AI  RAG 知识库,提供统一的过滤表达式支持 2025-04 初 Solon AI MCP 项目启动   2025-05 初 Solon Flow Designer 项目启动 (由 广东越

2024-09-27

中台样板     Luffy 基于 Solon 构建的,轻量级的嵌入式FaaS引擎(可按需组装),也可用作低代码引擎 TeamX 在 Luffy 基础上,构建的团队协作系统 NavX 在 Luffy 基础上,构建的导航系统(或轻量级博客

2024-08-20

收外部流程状态,支持流程状态扩展 [feat] 新增spel条件表达式,新增可通过SPI机制加载条件表达式 [feat] 新增分派监听器,支持代办任务中办理人等动态修改 [feat] 新增Easy-Query框架支持 [feat] 新增Mybatis-Flex的solon扩展包 [fea

2024-05-08

boot.undertow 原生编译支持 添加 solon 对 classpath*: 表达式支持(兼容旧的习惯) 添加 solon Utils:pid 方法(方便获取进程号) 添加 solon.data TranUtils:getDataSourceProxy 方法 添加 solon.cloud CloudProps:getNamespace 方法,允许每个中

2022-10-18

Java 国产的轻量级应用开发框架。可用来快速开发 Java 应用项目。主框架仅 0.1 MB。Helloworld: @Controller public class App { public static void main(String[] args) { Solon.start(App.class, args); } @Get @WebSocket @Mapping("/hello") public String hello(@Param(defaultVa

2024-06-29

权限 支持多租户 支持互斥网关,并行网关 支持条件表达式,可扩展 支持不同orm框架系统使用,支持不同orm框架和数据库扩展 同时支持spring和solon 兼容java8和java17,理论11也可以 官方提供基于ruoyi-vue封装实战项目,很

2024-10-25

包形式快速集成到项目,减少繁琐代码搬运和适配 条件表达式:内置常见的和spel条件表达式,并且支持自定义扩展 办理人变量表达式:内置${handler}和spel格式的表达式,可满足不同场景,灵活可扩展 orm框架扩展:目前支持

2023-09-20

ng 生态这个巨人存在。但,真的有很多人是期待的:一个轻量的,更现代感的,最好还是国产的。 刚开始的确会很难;刚开始可能不如人家的完善;刚开始会有很多人质疑和漫骂。再难能有芯片难???不是说非要替换代别人

2022-12-25

、更自由。没有 Spring,没有 Servlet,没有 JavaEE;独立的轻量生态。主框架仅 0.1 MB。 @Controller public class App { public static void main(String[] args) { Solon.start(App.class, args); } @Get @Socket @Mapping("/hello") public String hello(@Param(defaultValue = "java")

2022-12-17

、更自由。没有 Spring,没有 Servlet,没有 JavaEE;独立的轻量生态。主框架仅 0.1 MB。 @Controller public class App { public static void main(String[] args) { Solon.start(App.class, args); } @Get @Socket @Mapping("/hello") public String hello(@Param(defaultValue = "java")

2025-04-16

tor 是什么? 一句话介绍:SpEL Validator 是一个基于 Spring Expression Language 的轻量参数校验框架。 为什么要造这个轮子?因为用传统的 jakarta.validation 写复杂校验太麻烦了,比如你想校验一个字段的值要小于另一个字段,甚至是

2025-04-11

大大简化了数据建模工作。相关规范如 Persistence、Faces、Expression Language 和 Validation 均已支持这一特性。 主要规范更新 CDI 4.1:引入了在 @Produces 使用 @Priority 的能力。 Concurrency 3.1:支持 Java 21 的虚拟线程和 Reactive Streams