本文来自iteye @fairjm 转截请注明出处
---
偶尔会有一些业务需求是可以在线上代码运行的时候动态改变一些行为,一般的做法是使用个配置文件,存在数据库或者redis等存储中,程序动态获得之后解析根据配置进行相应的操作.在配置不复杂的情况下这样的做法能够满足需求.但如果配置很复杂,或者配置的规则很多,那么解析配置并运行就变成了一件很麻烦的事情.可能会引入一些解析器,或者`Criteria`这样的类.
如果这样,那是不是嵌入一段代码动态加载运行会不会简单点?
好在java本身就提供了这样的机制,也就是JSR-223
因为是开发使用的,所以最好还是用和java一样的语法,方便现有开发,那选取的脚本语言为groovy比较合适,毕竟能兼容java语法.
搞起.
首先引入依赖:
<dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-jsr223</artifactId> <version>2.4.7</version> </dependency>
我们这边做一个判断一个用户是否能够访问的例子.
其中要考虑的用户类如下(省略getter setter和构造器):
public class User { private String userName; private Long userId; private Boolean isVip; private Integer gender; private Integer age;
现在的规则是如果是非生产环境返回true,会员返回true,用户以test开头(这只是例子 千万别学)返回true 如果性别是男性并且大于18岁返回true(咦)
对应的groovy脚本如下:
if (!prod) { return true; } if (Boolean.TRUE.equals(user.getIsVip())) { return true; } if (user.getUserName()?.startsWith("test")) { return true; } if (user.getGender()?.equals(1) && user.getAge() != null && user.getAge() >= 18) { return true; } return false;
`?`表达式可以减少空判断,因为groovy兼容java,所以手工写 `!= null`(比如age)也是可以的.
接来下执行:
// 获取脚本引擎 final ScriptEngineManager factory = new ScriptEngineManager(); final ScriptEngine engine = factory.getEngineByName("groovy"); // 读取脚本 String str; try (BufferedReader reader = new BufferedReader( new InputStreamReader( GroovyScriptTest.class.getResourceAsStream("/groovy-script")))) { str = reader.lines().collect(Collectors.joining("\r\n")); } final User u = new User("fairjm", 1L, false, 1, 18); // groovy的引擎是支持可编译的所以直接这么写 final CompiledScript script = ((Compilable) engine).compile(str); final Bindings bindings = new SimpleBindings(); bindings.put("prod", true); bindings.put("user", u); final Boolean result = (Boolean) script.eval(bindings); System.out.println(result);
返回true.
以上,如果从写配置文件的角度想,上面那么几个条件以及条件的优先级和组合会比较麻烦(感兴趣的可以试试看).
参考了
http://www.ticmy.com/?p=267
原文对于JSR223说得比这文更详细,可以去读一下.
相关推荐
遵循 JSR 223 的抽象脚本引擎的实现。包含用于将 Java 对象导出到脚本的基本类成员解析器。 有关如何使用此核心来实现您自己的脚本引擎的更多信息,请参阅已经使用过的 。 这个库是。 建筑图书馆 要求 已安装 JDK ...
powershell-jsr223 用于实现 JSR 223 v0.1 的 Java 的 Powershell 脚本引擎
Java的本机外壳脚本引擎,实现JSR 223 支持的本机外壳 Bash:使用名称bash或扩展名.bash / .sh Cmd.exe:使用名称cmd或扩展名.bat 可执行文件:使用名称exec 用法 只需将JAR添加到您的类路径中,然后遵循 建造 ...
以执行以下操作: 从脚本环境访问和控制基于 Java 技术的对象使用脚本语言创建 Web 内容在基于 Java 技术的应用程序中嵌入脚本环境有关更多详细信息,请阅读要使用 Jav8 脚本引擎,请将文件 jav8-jsr223-xxx.jar ...
JSR 223 熟悉用于执行脚本的接口。 该库是,基于抽象引擎核心 。 建筑图书馆 要求 已安装 JDK 1.6 或更新版本 - 建议使用 JDK 1.8 已安装 已将系统变量JAVA_HOME为安装了 JDK 的目录,并将其二进制目录放在系统...
JShellScriptEngine 一个用于Java的JSR-223 ScriptEngine,它允许通过Java 9中的JShell repl执行Java代码段。 这将在当前JVM中运行JShell脚本,从而允许来回传递变量。用法 ScriptEngine engine = new ...
咖啡4java Java 的 CoffeeScript。 CoffeeScript 的 JSR-223 兼容脚本引擎。
各种Java脚本引擎接口 javascript, php, ruby, python等
用于 java 与 script进行交互的的jar包 javax.script
livetribe-jsr223.jar 使jdk1.5支持jbpm4,weblogic9支持jbpm4
Java Scripting specification.
2001年,他的项目通过 Java 规范请求(Java Specification Request,JSR)过程被接受为 Java 语言的候选扩展标准。这个项目现在称为 JSR-80 并且指定了官方包 javax.usb 。同时,在 2000年 6月,Mojo Jojo 和 David ...
使用JSR223 Sample进行变量赋值(如build.jmx文件中web(Thread Group)公共变量设置) 使用JSR223 Sample进行变量提取赋值(如bz_release_common.jmx文件中bff(Thread Group)公共变量设置) 使用JSR223 Sample...
JSR 206 Java API for XML Processing (JAXP) 1.3
类似于 Script 步骤的 PDI 插件,但更容易支持更多 JSR-223 脚本引擎和其他改进,例如: 用于选择脚本引擎的下拉 UI 支持传递给脚本的参数(而不是变量绑定) Groovy 代码片段(因为 Groovy 脚本引擎在 PDI 中...
第二部分介绍了什么是规则引擎及其架构和算法, 第三部分介绍了商业产品和开源项目实现等各种Java规则引擎, 第四部分对Java规则引擎API(JSR-94)作了详细介绍,讲解了其体系结构,管理API和运行时API及...
最新的Java主版本(JavaSE6,又称Mustang)现在正处于beta版本阶段。...脚本通常是动态键入的,其语法极富表现力,所编写出的算法要比Java中的等效算法简明得多。使用起来通常也很有趣。在很多情况下,从J
This document is the proposed final draft version of the JSR-133 specification, the Java Memory Model (JMM) and Thread Specification. This specification is intended to be part of the JSR-176 umbrella ...
使用JSR356在Java中构建WebSocket应用,详细介绍,包括1.服务器推送给客户端和2.客户端发送给服务器