ホームページ  >  記事  >  Java  >  SpringBoot と Groovy スクリプトを統合する方法

SpringBoot と Groovy スクリプトを統合する方法

WBOY
WBOY転載
2023-05-18 23:25:041613ブラウズ

スクリプト機能をアプリケーションに導入すると、柔軟性が大幅に向上します。コアの開発作業は、コア プラットフォーム機能の開発に集中できます。特定のシナリオの機能は、スクリプトを通じて実装できます。たとえば、Jenkins は Groovy スクリプトを使用して、ビルド プロセスを柔軟にカスタマイズできる書き込みパイプライン。 Spring 自体が Groovy 統合の仕組みを提供しており、Groovy を使用してプログラムを開発する方法 (Java での開発に似ており、コンパイルが必要) の 2 つの方法に分けられます。 1 つは、Groovy をコンパイルせずにスクリプトとして実行する方法です。ここで紹介するのは 2 番目の方法で、groovy をスクリプトとして使用します。

1. 概要

Spring に Groovy スクリプトを統合するには、主に 2 つのアイデアがあります。1 つは、Groovy スクリプトで Bean を定義し、Groovy スクリプトが Spring システム全体に統合されるようにすることです。普通の豆を使っても変わりません。 1 つは、プログラム内で Groovy スクリプトを呼び出し、その Groovy スクリプトを実行可能なコンポーネントにする方法です。以下では、これら 2 つの方法をそれぞれ紹介します。 Spring の Groovy スクリプトで定義された Bean を宣言するには 2 つの方法があります。1 つは従来の XML で、もう 1 つは spring-framework-4 で導入された Groovy 宣言方法です。

2. groovy で Bean を定義する

最初にインターフェイスを定義します:

public interface MyService {
    String fun(MyDomain myDomain);
}

ここでアイデアを提供します。Java コードを使用してデフォルトのインターフェイス実装を作成できます。デフォルトの実装では特定のシナリオの要件を満たしていない場合は、ストラテジーモードと連携し、Groovy スクリプトを使用して特定のシナリオを実装します。プログラムは非常に柔軟になります。スクリプトのホットローディング機構により、処理ロジックを変更する必要がある場合、プログラムの実行中、いつでもスクリプトの内容を調整でき、適時に反映されます。

このインターフェイスを Groovy スクリプトに実装します MyServiceImpl.groovy:

class MyServiceImpl implements MyService {
    @Autowired
    FunBean useBean;

    String myProp;

    String fun(MyDomain myDomain) {
        return myDomain.toString() + useBean.getFunName() + myProp;
    }
}

次に、xml と groovy の 2 つの構成メソッドを使用して Bean を宣言する方法を説明します。

2.1. XML 設定を通じて Groovy に実装された Bean を宣言します。

XML 設定を通じて Bean を宣言することは、伝統的な Spring メソッドです。このメソッドは最近、Java コードを介した宣言に置き換えられました。 Groovy スクリプトで定義された Bean を宣言する最も簡単な方法。

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:lang="http://www.springframework.org/schema/lang"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/lang https://www.springframework.org/schema/lang/spring-lang.xsd">
    <lang:groovy id="myServiceXml" script-source="classpath:MyServiceImpl.groovy" refresh-check-delay="10000" >
        <lang:property name="myProp" value=" this is xml init prop" />
    </lang:groovy>
</beans>

上記の XML コードは Bean myServiceXml を宣言しており、script-source は、この Bean のソースがスクリプト ファイル classpath:MyServiceImpl.groovy であることを指定しています。クラスパスを file に置き換えて、任意の場所にあるスクリプト ファイルを指定します。
refresh-check-delay スクリプトの更新間隔を定義し、スクリプトの内容が変更された場合に、スクリプトの内容を自動的に更新できます。
lang:propertyこのタグは、Bean のプロパティを初期化し、値を割り当てることができます。

xml と groovy を使用して 2 つの方法で Bean を宣言し、myProp 属性に異なる初期値を割り当てます。これは後続のデモ コードで確認できます。

2.2. Groovy 設定を通じて Groovy に実装された Bean を宣言する

Bean を宣言する Groovy メソッドは spring-framework-4 で導入されました。Bean を myServiceGroovy 宣言するために Groovy を使用します。 xml、groovy の宣言メソッドはより読みやすくなっています。

詳細な紹介については、Spring の公式ブログ投稿を参照してください: Spring Framework 4 の Groovy Bean 設定

import org.springframework.scripting.groovy.GroovyScriptFactory
import org.springframework.scripting.support.ScriptFactoryPostProcessor

beans {
    scriptFactoryPostProcessor(ScriptFactoryPostProcessor) {
        defaultRefreshCheckDelay = 10000
    }
    myServiceGroovy(GroovyScriptFactory, 'classpath:MyServiceImpl.groovy') {
        bean ->
            bean.scope = "prototype"
            myProp = ' this is Bean Builder init prop'
            bean.beanDefinition.setAttribute(ScriptFactoryPostProcessor.REFRESH_CHECK_DELAY_ATTRIBUTE, 6000)
    }
}

GroovyScriptFactoryBean を定義する Groovy スクリプトの場所を指定できます。 。 bean のラムダ式を通じて、Bean のプロパティを割り当てることができ、定義した myProp プロパティに加えて、スコープとスクリプトの更新時間も定義できます。

2.3. groovy に実装された Bean の呼び出し

先ほど、xml と groovy を通じて 2 つの Bean を宣言しました: myServiceXmlmyServiceGroovy、以下ではこれら 2 つを呼び出しますプログラム内の豆。

@SpringBootApplication
@ImportResource({"classpath:xml-bean-config.xml", "classpath:BeanBuilder.groovy"})
public class Application implements CommandLineRunner {

    @Autowired
    private MyService myServiceXml;
    @Autowired
    private MyService myServiceGroovy;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) throws ScriptException, ResourceException, IllegalAccessException, InstantiationException {
        MyDomain myDomain = new MyDomain();
        myDomain.setName("test");
        System.out.println(myServiceXml.fun(myDomain));
        myDomain.setName("test2");
        System.out.println(myServiceGroovy.fun(myDomain));
    }
}

まず、@ImportResource を介して Bean 宣言ファイルを導入し、次に通常の Bean 依存関係注入とメソッド呼び出しを導入します。Bean の使用では、スクリプト定義 Bean が使用されていることがわかります。プログラムで記述された Bean に違いはありません。 run メソッドでは、myServiceXml と myServiceGroovy という 2 つの Bean の fun メソッドをそれぞれ呼び出しました。 run メソッドを実行すると、結果への出力が表示されます:

MyDomain(name=test)FunBean this is xml init prop
MyDomain(name=test2)FunBean this is Bean Builder init prop

3. groovy スクリプトを実行します

groovy での Bean の前述の実装に加えて、これを実行することもできます。 GroovyGroovyスクリプトが提供するGroovyScriptEngineですが、このメソッドはspringframeworkに依存せず、通常のJavaプログラムでも利用できます。

@Component
public class MyEngine {
    private final GroovyScriptEngine engine;

    @Autowired
    private FunBean funBean;

    public MyEngine() throws IOException {

        engine = new GroovyScriptEngine(ResourceUtils.getFile("classpath:scripts/").getAbsolutePath()
                , this.getClass().getClassLoader());
    }

    public void runScript(int x, int y) throws IllegalAccessException,
            InstantiationException, ResourceException, ScriptException {
        Class<GroovyObject> calcClass = engine.loadScriptByName("CalcScript.groovy");
        GroovyObject calc = calcClass.newInstance();

        Object result = calc.invokeMethod("calcSum", new Object[]{x, y});
        System.out.println("Result of CalcScript.calcSum() method is " + result);

        Binding binding = new Binding();
        binding.setVariable("arg", "test");
        binding.setVariable("funBean", funBean);
        Object result1 = engine.run("CalcScript.groovy", binding);
        System.out.println("Result of CalcScript.groovy is " + result1);
    }
}

まず、GroovyScriptEngine を初期化し、構築メソッドでスクリプト ファイルへのパスを渡します。

スクリプトを実行するには 2 つの方法があります。1 つは、GroovyObject を取得し、invokeMethod を通じてスクリプト内のメソッドを実行する方法です。メソッドのパラメータは、Object 配列を通じて渡されます。

Class<GroovyObject> calcClass = engine.loadScriptByName("CalcScript.groovy");
GroovyObject calc = calcClass.newInstance();

Object result = calc.invokeMethod("calcSum", new Object[]{x, y});

2 つ目は、groovy スクリプトを直接実行する方法で、バインディングを通じて groovy スクリプトに変数を渡すことができます。

rree

以上がSpringBoot と Groovy スクリプトを統合する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。