> Java > java지도 시간 > Springboot를 Groovy 스크립트와 통합하는 방법

Springboot를 Groovy 스크립트와 통합하는 방법

WBOY
풀어 주다: 2023-05-18 23:25:04
앞으로
1640명이 탐색했습니다.

우리 애플리케이션에 스크립팅 기능을 도입하면 유연성이 크게 향상될 수 있습니다. 우리의 핵심 개발 작업은 특정 시나리오의 기능을 스크립트를 통해 구현할 수 있습니다. 빌드 프로세스를 매우 유연하게 사용자 정의할 수 있습니다. Spring 자체는 Groovy 통합을 위한 메커니즘을 제공하는데, 이는 두 가지 방법으로 나누어집니다. 하나는 Groovy를 사용하여 프로그램을 개발하는 것인데, 이는 Java로 개발하는 것과 유사하며 컴파일이 필요합니다. 하나는 컴파일 없이 스크립트로 Groovy를 실행하는 것입니다. 여기서 소개하는 것은 두 번째 방법인 Groovy를 스크립트로 사용하는 방법입니다.

1. 개요

Spring에서 Groovy 스크립트를 통합하는 데는 두 가지 주요 아이디어가 있습니다. 하나는 Groovy 스크립트에서 Bean을 정의하여 Groovy 스크립트가 전체 Spring 시스템에 통합되어 일반 Bean을 사용하는 것과 다르지 않습니다. 하나는 프로그램에서 Groovy 스크립트를 호출하고 Groovy 스크립트를 실행 가능한 구성 요소로 만드는 것입니다. 아래에서는 이 두 가지 방법을 각각 소개합니다. Spring에서 Groovy 스크립트에 정의된 Bean을 선언하는 방법에는 두 가지가 있습니다. 하나는 전통적인 xml이고 다른 하나는 spring-framework-4에 도입된 Groovy 선언 방법입니다.

2. Groovy에서 Bean을 정의합니다

먼저 인터페이스를 정의합니다.

public interface MyService {
    String fun(MyDomain myDomain);
}
로그인 후 복사

여기에 아이디어가 있습니다. 기본 구현이 특정 시나리오의 요구 사항을 충족하지 않는 경우 Java 코드를 사용할 수 있습니다. 전략 모드와 협력하면 그루비 스크립트를 사용하여 특정 시나리오를 구현합니다. 스크립트의 핫 로딩 메커니즘을 사용하면 처리 논리를 변경해야 할 때 프로그램이 실행되는 동안 언제든지 스크립트 내용을 조정할 수 있습니다. 적시에 적용됩니다.

이 인터페이스를 Groovy 스크립트 MyServiceImpl.groovy에 구현합니다. MyServiceImpl.groovy中实现这个interface:

class MyServiceImpl implements MyService {
    @Autowired
    FunBean useBean;

    String myProp;

    String fun(MyDomain myDomain) {
        return myDomain.toString() + useBean.getFunName() + myProp;
    }
}
로그인 후 복사

下面分别介绍通过xml和groovy两种配置方式来声明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代码声明了myServiceXml这个bean,script-source指定了这个bean的来源是classpath:MyServiceImpl.groovy这个脚本文件。将classpath替换为file,可以指定任一位置的脚本文件。
refresh-check-delay定义了脚本的刷新间隔,当脚本内容发生变化后,可以自动刷新脚本的内容。
lang:property这个标签可以对bean的属性进行初始化赋值。

我们分别用xml和groovy两种声明bean的方式给myProp这个属性赋值不同的初始值,在后续的演示代码中可以看到。

2.2、通过groovy配置的方式声明groovy中实现的bean

spring-framework-4中引入了groovy声明bean的方式,我们用groovy来声明myServiceGroovy这个bean,相比于xml的方式,groovy的声明方式可读性更强一些。

详细介绍见spring的官方博文: Groovy Bean Configuration in Spring Framework 4

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)
    }
}
로그인 후 복사

通过GroovyScriptFactory可以指定定义bean的groovy脚本位置。 通过bean的lambda表达式,可以对bean的属性进行赋值,除了我们定义的myProp这个属性外,还可以定义scope和脚本刷新时间。

2.3、调用groovy中实现的bean

前面我们通过xml和groovy两种方式分别声明了2个bean: myServiceXmlmyServiceGroovy,下面我们在程序中调用这2个bean。

@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

MyDomain(name=test)FunBean this is xml init prop
MyDomain(name=test2)FunBean this is Bean Builder init prop
로그인 후 복사
다음은 xml과 groovy의 두 가지 구성 방법을 통해 Bean을 선언하는 방법을 설명합니다.

2.1.xml 구성을 통해 groovy에서 구현된 bean 선언

xml 구성을 통해 bean을 선언하는 것은 전통적인 스프링 방법입니다. 이 방법은 최근에 java 코드를 통해 선언하는 것으로 대체되었지만 선언용으로는 여전히 가장 간단합니다. Groovy 스크립트에 정의된 Bean에 대한 메소드입니다.

@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);
    }
}
로그인 후 복사
위의 xml 코드는 myServiceXml 빈을 선언하고 script-source는 이 빈의 소스가 스크립트 파일 classpath:MyServiceImpl.groovy임을 지정합니다. 임의의 위치에 스크립트 파일을 지정하려면 클래스 경로를 파일로 바꾸십시오.
refresh-check-delay는 스크립트의 새로 고침 간격을 정의합니다. 스크립트 내용이 변경되면 스크립트 내용이 자동으로 새로 고쳐질 수 있습니다.
lang:property이 태그는 Bean의 속성을 초기화하고 값을 할당할 수 있습니다.

다음 데모 코드에서 볼 수 있는 myProp 속성에 서로 다른 초기 값을 할당하기 위해 xml과 groovy를 사용하여 두 가지 방법으로 Bean을 선언합니다.

2.2 Groovy 구성을 통해 Groovy에서 구현된 Bean 선언

spring-framework-4에서는 Groovy를 사용하여 myServiceGroovy Bean을 선언합니다. 더 읽기 쉽습니다.

자세한 내용은 spring 공식 블로그 게시물을 참조하세요. Spring Framework 4의 Groovy Bean 구성🎜
Class<GroovyObject> calcClass = engine.loadScriptByName("CalcScript.groovy");
GroovyObject calc = calcClass.newInstance();

Object result = calc.invokeMethod("calcSum", new Object[]{x, y});
로그인 후 복사
🎜 GroovyScriptFactory를 통해 Bean을 정의하는 Groovy 스크립트의 위치를 ​​지정할 수 있습니다. bean의 람다 표현식을 통해 정의한 myProp 속성 외에도 범위 및 스크립트 새로 고침 시간도 정의할 수 있습니다. 🎜

2.3.groovy에서 구현된 Bean 호출

🎜 앞서 우리는 xml과 groovy를 통해 2개의 Bean( myServiceXmlmyServiceGroovy)을 선언했습니다. 아래에서는 이 두 Bean을 호출합니다. 프로그램에서. 🎜
Binding binding = new Binding();
binding.setVariable("arg", "test");
binding.setVariable("funBean", funBean);
Object result1 = engine.run("CalcScript.groovy", binding);
로그인 후 복사
🎜 먼저 @ImportResource를 통해 Bean 선언 파일을 소개한 다음 일반 Bean의 종속성 주입 및 메소드 호출, 스크립트 정의 Bean 및 애플리케이션을 사용하는 것을 볼 수 있습니다. 쓴 콩에는 차이가 없습니다. run 메소드에서는 myServiceXml과 myServiceGroovy 두 빈의 fun 메소드를 각각 호출했습니다. run 메소드를 실행하여 출력을 확인하세요. 🎜rrreee🎜 3. groovy 스크립트를 실행합니다. 🎜🎜 앞서 언급한 것처럼 groovy에서 Bean을 구현하는 것 외에도 groovy에서 제공하는 GroovyScriptEngine을 통해 groovy 스크립트를 실행할 수도 있습니다. Spring Framework 및 일반 Java 프로그램에서도 사용할 수 있습니다. 🎜rrreee🎜먼저 GroovyScriptEngine을 초기화하고 생성 메소드에 스크립트 파일 경로를 전달합니다. 🎜🎜스크립트를 실행하는 방법에는 두 가지가 있습니다. 그 중 하나는 GroovyObject를 가져와서 InvokeMethod를 통해 스크립트에서 메서드를 실행하는 것입니다. 🎜rrreee🎜두 번째는 그루비 스크립트를 직접 실행하는 방법이고, 바인딩을 통해 그루비 스크립트에 변수를 전달할 수 있습니다. 🎜아아아아

위 내용은 Springboot를 Groovy 스크립트와 통합하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿