SpringBoot項目中使用Groovy腳本的示例代碼
最近項目中遇到瞭這樣的需求:需要檢查一個表的某些字段,是否為空,或者是否符合預期規則:比如大於0,或者在某個范圍內。考慮將表名和字段名配置在數據庫中,然後規則使用Groovy來寫,比較靈活。
1. 引入依賴
<dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy</artifactId> <version>2.5.5</version> </dependency> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-jsr223</artifactId> <version>2.5.5</version> </dependency>
2. 使用腳本引擎運行groovy腳本
ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine engine = factory.getEngineByName("groovy"); // 變量 Bindings bindings = engine.createBindings(); bindings.put("value", 10); // groovy腳本 String scriptStr = "if (value == null) { return false}\n if (value <= 0) {return false} else { return true}"; // 執行腳本 Object res = engine.eval(scriptStr, bindings);
在實際項目中,可以把ScriptEngine engine在項目初始化的時候生成,不需要每次調用都再去生成一個。
通過debug知道,在ScriptEngine內部有個map會緩存曾經執行過的腳本,所以性能方面也不需要擔心。
Groovy語法參考
3.思考
使用這種方式的好處是什麼?
- 方便:有新的表需要檢查字段的時候,加配置就可以,減少工作量;簡單的規則可以直接通過Groovy腳本實現,規則改變時可以很快的修改。
- 成本低:Groovy語法和Java很像,不需要付出太大的學習成本。
為什麼不使用規則引擎?
這不是個復雜的需求,現階段沒必要引入規則引擎也可以很好的完成需求。引入規則引擎會增加更多成本,但效果是差不多的。
SpringBoot+Groovy運行動態腳本
GroovyClassLoader方式
Java使用GroovyClassLoader動態加載Groovy腳本,調用腳本中的方法
在java中調用test.groovy腳本文件
ClassLoader parent = this.getClass().getClassLoader(); GroovyClassLoader loader = new GroovyClassLoader(parent); Class groovyClass = loader.parseClass( new File("src/main/java/com/example/demo/groovyscript/test.groovy") ); GroovyObject groovyObject= (GroovyObject)groovyClass.newInstance(); String result = (String) groovyObject.invokeMethod("test", id);
Groovy
test.groovy腳本文件
package com.example.demo.groovyscript class MyTest{ static String test(String id){ return "test1 id:"+ id; } }
GroovyScriptEngine方式
java使用GroovyScriptEngine腳本引擎加載Groovy腳本
方法調用
在java中調用test.groovy腳本文件
GroovyScriptEngine engine = new GroovyScriptEngine("src/main/java/com/example/demo/groovyscript"); Script script = engine.createScript("test.groovy", new Binding()); return (String) script.invokeMethod("test",id);
Groovy
test.groovy腳本文件
package com.example.demo.groovyscript
def test(id){ return "test2 id:"+ id; }
變量綁定
在java中調用test.groovy腳本文件
GroovyScriptEngine engine = new GroovyScriptEngine("src/main/java/com/example/demo/groovyscript"); Binding binding = new Binding(); binding.setVariable("id",id); engine.run("test.groovy",binding); return binding.getVariable("output").toString();
Groovy
test.groovy腳本文件
package com.example.demo.groovyscript output = "test3 id: ${id}"
到此這篇關於SpringBoot項目中使用Groovy腳本的示例代碼的文章就介紹到這瞭,更多相關SpringBoot使用Groovy腳本內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Springboot中動態語言groovy介紹
- Java代碼中與Lua相互調用實現詳解
- 如何創建SpringBoot項目
- 怎麼減少本地調試tomcat重啟次數你知道嗎
- springboot實現啟動直接訪問項目地址