您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

springboot怎么集成groovy脚本使用

2025/5/17 21:46:30发布22次查看
在我们的应用中引入脚本能力,可以很好的提升灵活性,我们的核心开发工作可以集中在核心平台能力的开发上,具体场景的功能可以通过脚本来实现,例如jenkins就可以通过groovy脚本来编写pipeline,可以很灵活的定制构建过程。 spring本身提供了groovy集成的机制,分为两种方式,一种是用groovy开发程序,跟用java开发类似,需要经过编译。一种是将groovy作为脚本来执行,不需要编译。在此我们介绍的是第二种方式,将groovy作为脚本来使用。 
一、概述在spring中集成groovy脚本,主要有2种思路,一种是在groovy脚本中定义bean,这样groovy脚本就融入了整个spring的体系,跟使用普通的bean没有区别。一种是在程序中调用groovy脚本,让groovy脚本成为一个可执行的部件。下面我们分别介绍这2种方式。 在spring中声明groovy脚本中定义的bean有两种方式,一种是传统的xml,一种是spring-framework-4中引入的groovy声明方式。
二、在groovy中定义bean首先我们定义一个interface:
public interface myservice {    string fun(mydomain mydomain);}
这儿提供了一种思路,我们可以用java代码编写默认的interface实现,如果默认实现不满足特定场景的要求时,配合策略模式,用groovy脚本实现特定场景,程序会变的很灵活,配合脚本的热加载机制,当处理逻辑需要变化时,在程序运行的过程中,我们可以随时调整脚本内容且能够及时生效。
在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中实现的beanspring-framework-4中引入了groovy声明bean的方式,我们用groovy来声明myservicegroovy这个bean,相比于xml的方式,groovy的声明方式可读性更强一些。
详细介绍见spring的官方博文: groovy bean configuration in spring framework 4
import org.springframework.scripting.groovy.groovyscriptfactoryimport org.springframework.scripting.support.scriptfactorypostprocessorbeans {    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: 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来引入bean的声明文件,然后就是普通的bean的依赖注入和方法调用,可以看到在bean的使用上,脚本定义的bean和用程序编写的bean没有任何区别。 在run方法中,我们分别调用了myservicexml和myservicegroovy的这2个bean的fun方法。 执行run方法可以看到输出到结果:
mydomain(name=test)funbean this is xml init propmydomain(name=test2)funbean this is bean builder init prop
三、执行groovy脚本除了前面提到的在groovy中实现bean以外,我们还可以通过groovy提供的groovyscriptengine来执行groovy脚本,这种方式不依赖于springframework,普通的java程序中也可以使用。
@componentpublic 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种,一种是获取到groovyobject,通过invokemethod来执行脚本中的某个方法,方法的参数通过object数组传入。
class<groovyobject> calcclass = engine.loadscriptbyname(calcscript.groovy);groovyobject calc = calcclass.newinstance();object result = calc.invokemethod(calcsum, new object[]{x, y});
第二种是直接运行groovy脚本,可以通过binding将变量传递到groovy脚本中。
binding binding = new binding();binding.setvariable(arg, test);binding.setvariable(funbean, funbean);object result1 = engine.run(calcscript.groovy, binding);
以上就是springboot怎么集成groovy脚本使用的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product