欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot項(xiàng)目中使用Groovy腳本的示例代碼

 更新時(shí)間:2021年08月27日 09:13:59   作者:側(cè)耳傾聽(tīng)nomorebb  
本文主要介紹了SpringBoot項(xiàng)目中使用Groovy腳本的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

最近項(xiàng)目中遇到了這樣的需求:需要檢查一個(gè)表的某些字段,是否為空,或者是否符合預(yù)期規(guī)則:比如大于0,或者在某個(gè)范圍內(nèi)??紤]將表名和字段名配置在數(shù)據(jù)庫(kù)中,然后規(guī)則使用Groovy來(lái)寫(xiě),比較靈活。

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. 使用腳本引擎運(yùn)行g(shù)roovy腳本

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}";
// 執(zhí)行腳本
Object res = engine.eval(scriptStr, bindings);

在實(shí)際項(xiàng)目中,可以把ScriptEngine engine在項(xiàng)目初始化的時(shí)候生成,不需要每次調(diào)用都再去生成一個(gè)。

通過(guò)debug知道,在ScriptEngine內(nèi)部有個(gè)map會(huì)緩存曾經(jīng)執(zhí)行過(guò)的腳本,所以性能方面也不需要擔(dān)心。

Groovy語(yǔ)法參考

3.思考

使用這種方式的好處是什么?

  • 方便:有新的表需要檢查字段的時(shí)候,加配置就可以,減少工作量;簡(jiǎn)單的規(guī)則可以直接通過(guò)Groovy腳本實(shí)現(xiàn),規(guī)則改變時(shí)可以很快的修改。
  • 成本低:Groovy語(yǔ)法和Java很像,不需要付出太大的學(xué)習(xí)成本。

為什么不使用規(guī)則引擎?

這不是個(gè)復(fù)雜的需求,現(xiàn)階段沒(méi)必要引入規(guī)則引擎也可以很好的完成需求。引入規(guī)則引擎會(huì)增加更多成本,但效果是差不多的。

SpringBoot+Groovy運(yùn)行動(dòng)態(tài)腳本

GroovyClassLoader方式

Java使用GroovyClassLoader動(dòng)態(tài)加載Groovy腳本,調(diào)用腳本中的方法

在java中調(diào)用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腳本

方法調(diào)用

在java中調(diào)用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中調(diào)用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}"

到此這篇關(guān)于SpringBoot項(xiàng)目中使用Groovy腳本的示例代碼的文章就介紹到這了,更多相關(guān)SpringBoot使用Groovy腳本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringSession 請(qǐng)求與響應(yīng)重寫(xiě)的實(shí)現(xiàn)

    SpringSession 請(qǐng)求與響應(yīng)重寫(xiě)的實(shí)現(xiàn)

    這篇文章主要介紹了SpringSession 請(qǐng)求與響應(yīng)重寫(xiě)的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • Netty分布式pipeline管道異常傳播事件源碼解析

    Netty分布式pipeline管道異常傳播事件源碼解析

    這篇文章主要為大家介紹了Netty分布式pipeline管道異常傳播事件源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Java中final關(guān)鍵字和final的四種用法實(shí)例

    Java中final關(guān)鍵字和final的四種用法實(shí)例

    final關(guān)鍵字代表最終的、不可改變的,下面這篇文章主要給大家介紹了關(guān)于Java中final關(guān)鍵字和final的四種用法實(shí)例,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • Java超詳細(xì)講解抽象類(lèi)的原理與用法

    Java超詳細(xì)講解抽象類(lèi)的原理與用法

    對(duì)于面向?qū)ο缶幊虂?lái)說(shuō),抽象是它的一大特征之一,在Java中可以通過(guò)兩種形式來(lái)體現(xiàn)OOP的抽象:接口和抽象類(lèi),下面這篇文章主要給大家介紹了關(guān)于Java抽象類(lèi)相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • SpringBoot validator參數(shù)驗(yàn)證restful自定義錯(cuò)誤碼響應(yīng)方式

    SpringBoot validator參數(shù)驗(yàn)證restful自定義錯(cuò)誤碼響應(yīng)方式

    這篇文章主要介紹了SpringBoot validator參數(shù)驗(yàn)證restful自定義錯(cuò)誤碼響應(yīng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java文件操作之IO流 File類(lèi)的使用詳解

    Java文件操作之IO流 File類(lèi)的使用詳解

    在java中提供有對(duì)于文件操作系統(tǒng)的支持,這個(gè)支持在java.io.File類(lèi)中進(jìn)行了定義,也就是說(shuō)在整個(gè)java.io包中File類(lèi)是唯一一個(gè)與文件本身操作有關(guān)的類(lèi)(創(chuàng)建,刪除,重命名)有關(guān)的類(lèi),而如果想要進(jìn)行File類(lèi)的操作,我們需要提供有完整的路徑支持,而后可以調(diào)用相應(yīng)的方法進(jìn)行處理
    2021-09-09
  • 老生常談 MyBatis 復(fù)雜查詢

    老生常談 MyBatis 復(fù)雜查詢

    這篇文章主要介紹了 MyBatis 復(fù)雜查詢的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Java實(shí)現(xiàn)遞歸山脈

    Java實(shí)現(xiàn)遞歸山脈

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)遞歸山脈,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 解析Java程序中對(duì)象內(nèi)存的分配和控制的基本方法

    解析Java程序中對(duì)象內(nèi)存的分配和控制的基本方法

    這篇文章主要介紹了解析Java程序中對(duì)象內(nèi)存的分配和控制的基本方法,包括計(jì)算對(duì)象的內(nèi)存占用的方法,要的朋友可以參考下
    2016-04-04
  • java使用zookeeper實(shí)現(xiàn)的分布式鎖示例

    java使用zookeeper實(shí)現(xiàn)的分布式鎖示例

    這篇文章主要介紹了java使用zookeeper實(shí)現(xiàn)的分布式鎖示例,需要的朋友可以參考下
    2014-05-05

最新評(píng)論