找回密码
 立即注册
首页 业界区 业界 Solon Expression Language (SnEL):轻量高效的Java表达 ...

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

账暴 2025-6-23 15:13:04
一、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. 丰富的表达式能力
  1. // 复杂逻辑表达式示例
  2. String expr = """
  3.     ((age > 18 AND salary < 5000) OR NOT isMarried)
  4.     AND tags IN ['vip','premium']
  5.     OR level == 'gold'""";
复制代码
支持功能主要包括:

  • 基础运算:算术、比较、逻辑运算
  • 集合操作:IN/NOT IN集合判断
  • 嵌套访问:多级对象属性/方法调用
  • 静态方法:直接调用类静态方法
  • 三元运算:条件表达式支持
更多参考官网:《SnEL 求值表达式语法和能力说明》
3. 独创的模板引擎

双模式模板处理:
  1. // 求值表达式模板
  2. SnEL.evalTmpl("订单总额:#{order.amount * 0.95}");
  3. // 属性表达式模板(带默认值)
  4. SnEL.evalTmpl("配置参数:${server.timeout:3000}");
复制代码
三、企业级功能深度解析

1. 上下文增强方案
  1. // 标准Map上下文
  2. Map<String,Object> ctx = new HashMap<>();
  3. ctx.put("user", userService.getCurrent());
  4. // 增强型Bean上下文
  5. StandardContext context = new StandardContext(userEntity);
  6. context.properties(configProps); // 绑定配置属性
  7. // 虚拟root访问
  8. SnEL.eval("root.id > 1000", context);
复制代码
2. 多场景表达式转换

基于AST的通用转换接口:
  1. Expression expr = SnEL.parse("age > 18 AND status=='active'");
  2. // 转换为Redis查询语法
  3. String redisFilter = RedisFilterTransformer.getInstance().transform(expr);
  4. // 转换为Elasticsearch DSL
  5. Map<String,Object> esQuery = ElasticsearchFilterTransformer.getInstance().transform(expr);
  6. // 输出语法树结构
  7. 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}}}]}}全文检索SQLWHERE age > 18 AND status='active'数据库查询四、典型应用场景


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

1. 添加依赖
  1. <dependency>
  2.     <groupId>org.noear</groupId>
  3.     solon-expression</artifactId>
  4.     <version>最新版本</version>
  5. </dependency>
复制代码
2. 基础用法示例
  1. public class Demo {
  2.     public static void main(String[] args) {
  3.         Map<String,Object> context = new HashMap<>();
  4.         context.put("price", 99.5);
  5.         context.put("discount", 0.8);
  6.         
  7.         Object result = SnEL.eval("price * discount > 50", context);
  8.         System.out.println("是否符合条件:" + result);
  9.     }
  10. }
复制代码
3. 性能优化建议


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

案例1:电商促销系统
  1. // 动态计算促销条件
  2. String rule = """
  3.     (user.level IN ['VIP','SVIP'] OR order.amount > 1000)
  4.     AND inventory.stock > 0
  5.     AND NOT blacklist.contains(user.id)""";
  6.    
  7. Boolean rst = SnEL.eval(rule, context);
复制代码
案例2:物联网数据处理
  1. // 设备数据过滤规则
  2. String filter = """
  3.     (data.temperature > 38.5 OR data.humidity < 20)
  4.     AND meta.deviceType == 'medical'""";
  5. // 转换为MQTT Topic过滤语法(需要自已定制 IotTransformer)
  6. String mqttFilter = IotTransformer.transform(SnEL.parse(filter));
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册