Simple EL是一个表达式解析引擎。它将表达式解析分成四个部分:预处理、编译、缓存和执行。这四个步骤任意一部分都可以替换,类似设计模式中的Template Method。 SimpleEL将表达式处理成Java Source,调用Tools.jar的Javac API动态编译,缓存编译后反射得到的实例,使得表达式的解析速度和Java静态编译的速度接近。
这是一个性能极致、扩展性良好的表达式解析引擎。图示
http://code.alibabatech.com/wiki/download/attachments/1966084/simple_el.png?version=2&modificationDate=1302249958000
目前SimpleEL有三种实现,缺省实现,TinyEL,QL,其中TinyEL在下一个版本中将会替换为缺省实现,QL是一种类SQL的表达式语言,它试图创造一种对象查询语言。
Slider :
http://code.alibabatech.com/svn/SimpleEL/trunk/doc/SimpleEL.pptx
SVN:
http://code.alibabatech.com/svn/simpleel
JIRA:
http://code.alibabatech.com/jira/browse/simpleel
WIKI:
http://code.alibabatech.com/wiki/display/simpleel/Home
Download:
http://code.alibabatech.com/wiki/display/SimpleEL/Download
Maven Repository:
<repository>
<id>opensesame</id>
<name>Alibaba OpenSource Repsoitory</name>
<url>http://code.alibabatech.com/mvn/releases/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>SimpleEL</artifactId>
<version>0.1</version>
</dependency>
import com.alibaba.simpleEL.eval.DefaultExpressEvalService;
import com.alibaba.simpleEL.preprocess.DefaultVariantResolver.Type;
DefaultExpressEvalService service = new DefaultExpressEvalService();
service.regsiterVariant(int.class, "a", "b");
Map<String, Object> ctx = new HashMap<String, Object>();
ctx.put("a", 3);
ctx.put("b", 4);
Assert.assertEquals(7, service.eval(ctx, "@a + @b"));
DefaultExpressEvalService service = new DefaultExpressEvalService();
service.regsiterVariant(int.class, "a", "b");
service.setAllowMultiStatement(true); //support multi-statement
Map<String, Object> ctx = new HashMap<String, Object>();
ctx.put("a", 3);
ctx.put("b", 4);
Assert.assertEquals(1, service.eval(ctx, "if (@a > @b) { return @a - @b; } else {return @b - @a; }"));
TinyEL是SimpleEL中的一种实现,和SimpleEL的缺省实现不同的是,它的预处理不是简单的替换变量,而是经过语法分析之后生成Java Source。变量名称不需要使用@标识。 TinyEL在下一个版本中,可能会升级为SimpleEL的缺省实现。
使用示例:
调用方法
import com.alibaba.simpleEL.dialect.tiny.TinyELEvalService;
TinyELEvalService service = new TinyELEvalService();
service.regsiterVariant(String.class, "name");
Map<String, Object> ctx = new HashMap<String, Object>();
ctx.put("name", "abc");
Assert.assertEquals(5, service.eval(ctx, "('aa' + name).length()"));
* 调用静态方法
TinyELEvalService service = new TinyELEvalService();
service.regsiterVariant(int.class, "a", "b"); //注册a和b两个变量为int类型
Map<String, Object> ctx = new HashMap<String, Object>();
ctx.put("a", 3);
ctx.put("b", 4);
Assert.assertEquals(4, service.eval(ctx, "java.lang.Math.max(a, b)"));
* 构造对象
TinyELEvalService service = new TinyELEvalService();
service.regsiterVariant(long.class, "millis");
long millis = System.currentTimeMillis();
Map<String, Object> ctx = new HashMap<String, Object>();
ctx.put("millis", millis);
Assert.assertEquals(new java.util.Date(millis), service.eval(ctx, "new java.util.Date(millis)"));
* 三元表达式
TinyELEvalService service = new TinyELEvalService();
service.regsiterVariant(int.class, "a", "b");
Map<String, Object> ctx = new HashMap<String, Object>();
ctx.put("a", 3);
ctx.put("b", 4);
Assert.assertEquals(4, service.eval(ctx, "a > b ? a : b"));
Assert.assertEquals(true, service.eval(ctx, "a instanceof Number"));
* 数组访问
TinyELEvalService service = new TinyELEvalService();
service.regsiterVariant(int.class, "a", "b");
service.regsiterVariant(int[].class, "c");
Map<String, Object> ctx = new HashMap<String, Object>();
ctx.put("a", 3);
ctx.put("b", 4);
ctx.put("c", new int[] { 1, 2 });
Assert.assertEquals(4, service.eval(ctx, "Math.max(c[0], c[1]) + 2"));
* 注册函数
TinyELEvalService service = new TinyELEvalService();
service.regsiterVariant(int.class, "a", "b");
service.registerFunction("max", Math.class.getMethod("max", new Class<?>[] { int.class, int.class }));
Map<String, Object> ctx = new HashMap<String, Object>();
ctx.put("a", 3);
ctx.put("b", 4);
Assert.assertEquals(7, service.eval(ctx, "a + b"));
Assert.assertEquals(true, service.eval(ctx, "a < b"));
Assert.assertEquals(4, service.eval(ctx, "max(a, b)"));
* 各种运算符
TinyELEvalService service = new TinyELEvalService();
service.regsiterVariant(int.class, "a", "b");
Map<String, Object> ctx = new HashMap<String, Object>();
ctx.put("a", 3);
ctx.put("b", 4);
Assert.assertEquals(3, service.eval(ctx, "a++"));
Assert.assertEquals(4, ctx.get("a"));
Assert.assertEquals(5, service.eval(ctx, "++a"));
Assert.assertEquals(5, ctx.get("a"));
Assert.assertEquals(4, service.eval(ctx, "--a"));
Assert.assertEquals(4, ctx.get("a"));
Assert.assertEquals(true, service.eval(ctx, "a > b || b > a || a == b"));
Assert.assertEquals(false, service.eval(ctx, "a > b && b > a && a == b"));
Assert.assertEquals(false, service.eval(ctx, "a != b"));
* 使用if语句
TinyELEvalService service = new TinyELEvalService();
service.setAllowMultiStatement(true);
service.regsiterVariant(int.class, "a", "b");
Map<String, Object> ctx = new HashMap<String, Object>();
ctx.put("a", 3);
ctx.put("b", 4);
Assert.assertEquals(1, service.eval(ctx, "if (a > b) { return a - b; } else {return b - a; }"));
* 声明本地变量
TinyELEvalService service = new TinyELEvalService();
service.setAllowMultiStatement(true);
service.regsiterVariant(int.class, "a", "b");
Map<String, Object> ctx = new HashMap<String, Object>();
ctx.put("a", 3);
ctx.put("b", 4);
Assert.assertEquals(70, service.eval(ctx, "int i = 10; return a * i + b * i;"));
* 使用While
TinyELEvalService service = new TinyELEvalService();
service.setAllowMultiStatement(true);
service.regsiterVariant(int.class, "a", "b");
Map<String, Object> ctx = new HashMap<String, Object>();
ctx.put("a", 3);
ctx.put("b", 4);
Assert.assertEquals(48, service.eval(ctx, "int i = 0; while (i < 10) { a += i++; } return a;"));
Assert.assertEquals(48, ctx.get("a"));
Assert.assertEquals(4, ctx.get("b"));
* 使用For
TinyELEvalService service = new TinyELEvalService();
service.setAllowMultiStatement(true);
service.regsiterVariant(int.class, "a", "b");
Map<String, Object> ctx = new HashMap<String, Object>();
ctx.put("a", 3);
ctx.put("b", 4);
Assert.assertEquals(52, service.eval(ctx, "for (int i = 0; i < 10; ++i) { a += i; } return a + b;"));
Assert.assertEquals(48, ctx.get("a"));
Assert.assertEquals(4, ctx.get("b"));
* 使用ForEach
TinyELEvalService service = new TinyELEvalService();
service.setAllowMultiStatement(true);
service.regsiterVariant(int[].class, "a");
Map<String, Object> ctx = new HashMap<String, Object>();
ctx.put("a", new int[] {1, 2, 3, 4, 5});
Assert.assertEquals(15, service.eval(ctx, "int sum = 0; for (int i : a) { sum += i; } return sum;"));
分享到:
相关推荐
2008年左右,阿里巴巴开始尝试MySQL的相关研究,并开发了基于MySQL分库分表技术的相关产品,Cobar/TDDL(目前为阿里云DRDS产品),解决了单机Oracle无法满足的扩展性问题,当时也掀起一股去IOE项目的浪潮,愚公这项目...
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。
这些阿里巴巴开源项目不仅在国内,也在全球范围内产生了广泛的影响,推动了微服务架构的发展和落地。它们的广泛应用和持续更新,反映了阿里巴巴对开源社区的贡献,也体现了中国企业在技术创新和标准化方面的领导地位...
本项目深入解析并应用了阿里巴巴开源的Java诊断工具Arthas的设计源码,涉及1228个文件,涵盖653个Java源文件、159个Markdown文档、151个PNG图片、74个Vue文件、28个XML文件、26个JPG图片、22个JavaScript文件、18个...
该项目深入分析了基于阿里巴巴开源的Java诊断工具Arthas的设计源码,涵盖376个文件,其中Java源文件占主导地位,共248个。文件类型还包括Markdown文档、XML配置、Shell脚本、图片、批处理文件、JAR包、文本、...
在Java中解析Excel文件,可以使用多种不同的库,其中最流行和广泛使用的包括Apache POI和EasyExcel(阿里巴巴开源)。压缩包文档中描述了使用这两个库解析Excel文件的基本步骤。 选择哪个库取决于你的具体需求,比如...
藏经阁-【云栖精选12月刊】2017年,阿里巴巴开源那些事.pdf
阿里巴巴的10款开源项目 阿里巴巴的10款开源项目涵盖了多个领域,包括框架、服务框架、JavaScript 框架、AOP 框架、数据访问框架、Web 框架、MVC 框架、Canvas 图形框架、NodeJs 框架、数据库连接池、JSON 解析器、...
【首届阿里开源峰会回顾】 在201X年,阿里巴巴举办了其历史上的首届开源峰会,这次盛会聚集了全球...通过这些项目的分享,我们可以看到,开源技术正在不断推动互联网行业的进步,而阿里巴巴正积极参与并引领这一进程。
插件中的“p3c-master”可能是指P3C(Alibaba Java Coding Guidelines)项目的源码仓库,这个项目是阿里巴巴规约插件的开源实现。通过查看源码,开发者可以更深入地理解插件的工作原理,甚至参与到插件的改进和扩展...
《尽在双11:阿里巴巴技术演进与超越》是一本深入探讨阿里巴巴在双十一这个全球最大的线上购物狂欢节背后的技术发展历程和技术挑战的书籍。书中详细阐述了阿里巴巴如何应对每年双十一期间的巨大流量冲击,以及在技术...
fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。主要特点:快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson)强大(支持普通JDK类包括任意Java Bean ...
阿里巴巴Java开发规约插件是基于开源项目PMD实现的一款编码规范检查工具,它旨在提升Java代码质量和一致性。PMD是一款强大的源代码分析器,能够检测出潜在的代码问题,如未使用的变量、过长的方法、复杂的表达式等。...
Destoon是一款功能强大的开源B2B(Business to Business)建站系统,它提供了企业信息展示、产品发布、供求信息发布、在线交易等多种功能。这款仿阿里巴巴的黄色模板将这些功能与阿里巴巴网站的界面设计相结合,...
《阿里巴巴酒店数据库设计》项目是基于Java Web技术和MySQL数据库实现的一款实用系统,旨在提供酒店管理的全面解决方案。这个项目不仅包含完整的源代码,还附带了数据库文件,使得用户能够轻松进行增、删、改、查等...
【标题】"仿阿里巴巴黄色版2013版DT5" 指的是一个基于 Destoon 5(DT5)内容管理系统开发的模板,该模板的设计风格模仿了2013年时期的阿里巴巴网站,旨在为用户提供类似阿里巴巴的商务平台体验。这种模板特别适合...
阿里巴巴普惠体是一款由阿里巴巴集团设计并发布的开源字体,旨在为全球用户提供免费、全场景的字体解决方案。这款字体的出现,打破了传统字体授权的壁垒,使得无论是个人还是企业,都可以在设计工作中自由使用,大大...
DataX 是阿里云 DataWorks数据集成 的开源版本,在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、...
《阿里巴巴中文站架构设计实践》是由何崚分享的深度技术文档,主要涵盖了在大数据背景下,阿里巴巴如何构建和优化其中文网站的架构。这份资料详细解析了阿里巴巴在处理海量数据、保障系统稳定性和提升用户体验等方面...