当前位置:

首页 > 编程开发 > springboot怎么集成groovy脚本使用

springboot怎么集成groovy脚本使用

在我们的应用中引入脚本能力,可以很好的提升灵活性,我们的核心开发工作可以集中在核心平台能力的开发上,具体场景的功能可以通过脚本来实现,例如jenkins就可以通过groovy脚本来编写pipeline,可以很灵活的定制构建过程。spring本身提供了groovy集成的机制,分为两种方式,一种是用groovy开发程序,跟用java开发类似,需要经过编译。一种是将groovy作为脚本来执行,不需要编译。在此我们介绍的是第二种方式,将groovy作为脚本来使用。一、概述在spring中集成groovy脚本,主要

本文目录

    在我们的应用中引入脚本能力,可以很好的提升灵活性,我们的核心开发工作可以集中在核心平台能力的开发上,具体场景的功能可以通过脚本来实现,例如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来说还是最简单的方法。

    
        
            
        
    

    以上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: 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 prop
    MyDomain(name=test2)FunBean this is Bean Builder init prop

    三、执行groovy脚本

    除了前面提到的在groovy中实现bean以外,我们还可以通过groovy提供的GroovyScriptEngine来执行groovy脚本,这种方式不依赖于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 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 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);
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    Groovy 脚本间类引用失败的根源与正确加载方案
    Groovy 脚本间类引用失败的根源与正确加载方案

    Groovy跨文件类引用失败源于parse()未将类注册到运行时类型系统,导致静态引用无法解析。正确方案是使用GroovyClassLoader.addClasspath()添加源码根目录,严格遵循包路径结构,通过evaluate()执行,确保依赖链完整,适用于SAPCommerce等容器环境。

    PHP入门指南:PHP和Groovy
    PHP入门指南:PHP和Groovy

    PHP是一种流行的服务器端脚本语言,它用于Web开发和构建动态网站。而Groovy则是一种动态编程语言,能够无缝地与Java语言互操作。本文将讨论PHP和Groovy的入门指南。PHP入门指南PHP是一种开源的编程语言,它在服务器上运行,并且在Web开发中很受欢迎。它的语法简单,易于学习,并且由于具有广泛的社区支持,使PHP成为一个极其强大的Web开发工具。

    springBoot项目常用目录有哪些
    springBoot项目常用目录有哪些

    springBoot项目常用目录springBoot项目的目录结构及名规范介绍基于SpringBoot开发时的目录结构及命名规范,通过介绍能够为你解决,在实际项目中如何规划目录结构?如何命名目录更规范?各个目录分别代表什么含义?等三个问题。目录说明servicex//项目名|-admin-ui//管理服务前端代码(一般将UI和SERVICE放到一个工程中,便于管理)|-servicex-auth//模块1|-servicex-common//模块2|-servicex-gateway//模块3|-serv

    解析SpringBoot和SpringMVC之间的异同
    解析SpringBoot和SpringMVC之间的异同

    解析SpringBoot和SpringMVC之间的异同SpringBoot和SpringMVC是Java领域中非常重要的开发框架。虽然它们都属于Spring框架的一部分,但是在使用和功能上有一些明显的区别。本文将对SpringBoot和SpringMVC进行比较,解析它们之间的异同。首先,让我们来了解一下SpringBoot。SpringBo

    探索SpringCloud和SpringBoot在微服务领域的不同应用方式
    探索SpringCloud和SpringBoot在微服务领域的不同应用方式

    近年来,随着云计算和分布式架构的兴起,微服务架构的应用越来越广泛。而SpringCloud和SpringBoot作为Java开发中的两个重要框架,对于微服务的实现起到了重要的作用。然而,很多人对于它们在微服务领域的不同应用方式还存在一定的疑惑。本文将从不同的角度探索SpringCloud和SpringBoot在微服务中的应用方式。首先,我们来了解一下Spri

    SpringBoot和SpringMVC有何区别?
    SpringBoot和SpringMVC有何区别?

    SpringBoot与SpringMVC的不同之处在哪里?SpringBoot和SpringMVC是两个非常流行的Java开发框架,用于构建Web应用程序。尽管它们经常分别被使用,但它们之间的不同之处也是很明显的。首先,SpringBoot可以被看作是一个Spring框架的扩展或者增强版。它旨在简化Spring应用程序的初始化和配置过程,以帮助开发人

    比较SpringBoot和SpringMVC的异同
    比较SpringBoot和SpringMVC的异同

    SpringBoot和SpringMVC都是Java开发中常用的框架,但它们之间有一些明显的差异。本文将探究这两个框架的特点和用途,并对它们的差异进行比较。首先,我们来了解一下SpringBoot。SpringBoot是由Pivotal团队开发的,它旨在简化基于Spring框架的应用程序的创建和部署。它提供了一种快速、轻量级的方式来构建独立的、可执行

    SpringBoot与SpringMVC的不同点是什么?
    SpringBoot与SpringMVC的不同点是什么?

    SpringBoot和SpringMVC是Java开发中常用的两个框架,它们都是由Spring框架所提供的,但在功能和使用方式上有着一些区别。本文将分别介绍SpringBoot和SpringMVC的特点和区别。一、SpringBoot的特点:简化配置:SpringBoot通过约定优于配置的原则,大大简化了项目的配置过程。它可以自动配置项目所需要的参数,开发人

    比较和选择指南:SpringCloud与SpringBoot的功能比较
    比较和选择指南:SpringCloud与SpringBoot的功能比较

    SpringCloud和SpringBoot是目前Java领域中最热门的开源框架,它们分别提供了一套完善的微服务架构和快速构建应用程序的解决方案。本文将对它们的功能进行比较,并给出选择指南,以帮助读者了解它们的优势和适用场景。SpringBoot是一个用于开发Java应用程序的框架,它提供了一个简化的开发流程,集成了大量常用的功能和组件,减少了开发者的工作量

    SpringCloud与SpringBoot:分析它们之间的相似与不同
    SpringCloud与SpringBoot:分析它们之间的相似与不同

    深入剖析SpringCloud和SpringBoot的异同引言:在构建企业级应用程序时,Spring框架已经成为开发者们的首选。它提供了一种简单而强大的方式来构建独立于平台的应用程序。Spring框架由两个核心模块组成:SpringBoot和SpringCloud。虽然它们都可以帮助开发者快速搭建应用程序,但它们的目标和用途存在一些差异。本文将深入剖析Spr

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。