우리 애플리케이션에 스크립팅 기능을 도입하면 유연성이 크게 향상될 수 있습니다. 우리의 핵심 개발 작업은 특정 시나리오의 기능을 스크립트를 통해 구현할 수 있습니다. 빌드 프로세스를 매우 유연하게 사용자 정의할 수 있습니다. Spring 자체는 Groovy 통합을 위한 메커니즘을 제공하는데, 이는 두 가지 방법으로 나누어집니다. 하나는 Groovy를 사용하여 프로그램을 개발하는 것인데, 이는 Java로 개발하는 것과 유사하며 컴파일이 필요합니다. 하나는 컴파일 없이 스크립트로 Groovy를 실행하는 것입니다. 여기서 소개하는 것은 두 번째 방법인 Groovy를 스크립트로 사용하는 방법입니다.
Spring에서 Groovy 스크립트를 통합하는 데는 두 가지 주요 아이디어가 있습니다. 하나는 Groovy 스크립트에서 Bean을 정의하여 Groovy 스크립트가 전체 Spring 시스템에 통합되어 일반 Bean을 사용하는 것과 다르지 않습니다. 하나는 프로그램에서 Groovy 스크립트를 호출하고 Groovy 스크립트를 실행 가능한 구성 요소로 만드는 것입니다. 아래에서는 이 두 가지 방법을 각각 소개합니다. Spring에서 Groovy 스크립트에 정의된 Bean을 선언하는 방법에는 두 가지가 있습니다. 하나는 전통적인 xml이고 다른 하나는 spring-framework-4에 도입된 Groovy 선언 방법입니다.
먼저 인터페이스를 정의합니다.
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。
通过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这个属性赋值不同的初始值,在后续的演示代码中可以看到。
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和脚本刷新时间。
前面我们通过xml和groovy两种方式分别声明了2个bean: myServiceXml
和myServiceGroovy
,下面我们在程序中调用这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을 선언하는 방법을 설명합니다.
@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을 선언합니다.
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 속성 외에도 범위 및 스크립트 새로 고침 시간도 정의할 수 있습니다. 🎜myServiceXml
및 myServiceGroovy
)을 선언했습니다. 아래에서는 이 두 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!