`

JSR223 Java使用脚本引擎动态修改业务逻辑

阅读更多

本文来自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说得比这文更详细,可以去读一下.  

0
0
分享到:
评论

相关推荐

    jsr223 enjines

    2. **BeanShell**:BeanShell是一个小型、开源的Java脚本环境,它可以动态地执行Java代码并提供一个交互式的控制台。BeanShell允许开发者在运行时修改类和对象,非常适合快速原型开发和调试。 3. **OGNL (Object-...

    Java 8 Nashorn 脚本引擎

    1. **JSR 223接口**:Nashorn实现了JSR 223(Java Scripting API),这使得Java应用程序可以使用任何支持JSR 223的脚本语言,包括JavaScript。通过`ScriptEngineManager`类,开发者可以轻松地创建和使用JavaScript...

    Java脚本语言程序员手册

    《Java脚本语言程序员手册》是一本专门为Java脚本编程者设计的指南,旨在帮助开发者深入理解和高效利用Java脚本语言。手册详细介绍了Java Scripting API(JSR 223)以及相关的脚本框架,如Rhino和Nashorn,这些都是...

    JAVA 脚本应用数据

    综上所述,Java脚本应用数据结合JavaMail API可以让我们在处理电子邮件时引入更灵活的数据处理逻辑,实现复杂的业务需求。通过JSR 223,我们可以轻松地集成各种脚本语言,提升Java应用程序的可扩展性和灵活性。

    mvel-jsr223:作为 MVEL(MVFLEX 表达式语言)的扩展,此增强功能可以支持并兼容 JSR 223 规范

    `mvel-jsr223`项目则是MVEL对JSR 223规范的支持和实现,意味着你可以将MVEL作为一种符合JSR 223的脚本引擎在Java应用程序中使用。通过这个扩展,开发者可以利用MVEL的强大功能,同时享受到JSR 223带来的便利,比如与...

    office文档处理,动态脚本.zip

    在这个压缩包中,可能包含的代码示例会演示如何使用Java来处理Office文档,如创建、读取或更新文件内容,以及如何集成和执行动态脚本,例如用JavaScript实现特定的业务逻辑。学习这些示例可以帮助开发者提高在实际...

    Scripting in Java-带书签目录超清文字版.pdf

    1. **脚本语言介绍**:简述JavaScript、Groovy、JRuby等流行的Java脚本语言,比较它们的特性和用途。 2. **Java Scripting API**:详细介绍JSR 223,包括`ScriptEngine`、`ScriptEngineManager`和`ScriptContext`的...

    Java SE 6 新特性

    这一特性对于快速原型开发、自动化测试以及需要动态性的复杂业务逻辑尤其有用。 总的来说,Java SE 6引入的脚本语言支持通过JSR 223实现了Java平台与多种脚本语言的无缝集成,提供了统一的接口,降低了开发复杂性,...

    Java中使用Groovy的三种方式

    Java 6引入了JSR 223(Scripting for the Java Platform),允许在Java程序中直接执行脚本语言。Groovy可以作为这种嵌入式脚本语言使用。通过`groovy.lang.GroovyShell`或`groovy.lang.GroovyScriptEngine`,你可以...

    script-machine:Java 脚本应用程序

    在IT行业中,Java脚本应用程序通常指的是利用Java平台上的脚本引擎执行的程序,这些引擎允许开发者使用类似于JavaScript、Groovy、Ruby等动态语言的语法编写代码,而享受到Java平台的强大功能和稳定性。"Script ...

    bsf.jar

    10. **替代方案**:随着Java语言的发展,JSR 223(Java Scripting API)和JSR 233(Java Compiler API)成为更现代的脚本语言集成方式。这些API提供了与BSF类似的功能,但更加强大和灵活,是BSF的一个可能替代。 ...

    JSR303 jar包 文档

    使用JSR 303进行数据验证的好处在于,它可以将验证逻辑与业务逻辑分离,提高了代码的可读性和可维护性。开发者可以在模型类上直接应用验证注解,然后通过`Validator`实例来验证整个对象或者对象的某个属性。这样,...

    drools-jsr94-6.1.0.CR1.zip

    【标题】"drools-jsr94-6.1.0.CR1.zip" 提供的是 Drools 的一个版本,这是一个著名的规则引擎,它基于 Java Specification Request (JSR) 94 标准。Drools 实现了业务规则管理系统 (BRMS),允许开发者将复杂的业务...

    Java中动态规则的实现方式示例详解

    动态语言如Groovy可以让Java开发者使用一种更简洁、更接近脚本的语法来编写代码,这在处理动态规则时非常有用。Groovy可以与Java无缝集成,允许在Java程序中直接执行Groovy脚本。 3. 规则引擎(Rule Engine) 规则...

    JMeter基础(2)录制脚本Java开发Java经验技巧

    同时,JMeter有丰富的第三方插件,如CSV Data Set Config用于读取数据文件,JSR223 Sampler可以执行Groovy或其他脚本语言,增强脚本的灵活性。 此外,对于Java开发者来说,理解和处理JMeter的日志与报告也是一项...

    jolokia-jsr160-1.2.2.zip

    DAO模式则是一种设计模式,用于封装数据库操作,以减少业务逻辑与数据存储之间的耦合。 "pedal-tx"可能是指Pedal框架中的事务管理部分,因为"tx"通常与数据库事务(transaction)相关。在Java应用中,事务管理是...

    Jmeter基础(1)jmeter基础概念Java开发Ja

    6. **JSR223脚本**:JMeter还支持JSR223接口,这意味着你可以使用任何支持该接口的脚本语言(如Groovy、JavaScript等)来增强测试逻辑,提高效率。 三、Java经验技巧 7. **性能测试设计**:在使用JMeter时,合理...

    SeaShell:在 Java 中使用自定义脚本语言的自定义命令行 shell

    - **脚本引擎**:支持多种脚本语言,如JavaScript、Groovy等,通过Java Scripting API(JSR 223)进行集成。 - **命令执行器**:将解析后的命令传递给对应的脚本引擎执行,并处理执行结果。 - **交互界面**:提供...

    java 请求参数过滤拦截

    这里的“java请求参数过滤拦截”主要是指在接口接收到用户输入的数据时,通过过滤器(Filter)对参数进行检查,防止恶意攻击者利用特殊字符执行SQL注入、跨站脚本攻击(XSS)等危害。下面我们将详细探讨这一主题。 ...

Global site tag (gtag.js) - Google Analytics