首页 > 其他分享 >Spring boot中使用groovy

Spring boot中使用groovy

时间:2024-04-18 12:13:28浏览次数:27  
标签:groovy name Spring boot springframework context import org

groovy 是当做一个脚本来用的,也可以从数据库加载代码做一些动态数据处理。

搭建一个spring boot环境,pom.xml中编辑器和jar包,spring boot是 2.1.6.RELEASE

<dependency>
  <groupId>org.codehaus.groovy</groupId>
  <artifactId>groovy-all</artifactId>
  <version>2.4.7</version>
</dependency>


<plugin>
  <groupId>org.codehaus.gmavenplus</groupId>
  <artifactId>gmavenplus-plugin</artifactId>
  <version>1.13.1</version>
  <executions>
    <execution>
      <goals>
        <goal>addSources</goal>
        <goal>addTestSources</goal>
        <goal>generateStubs</goal>
        <goal>compile</goal>
        <goal>generateTestStubs</goal>
        <goal>compileTests</goal>
        <goal>removeStubs</goal>
        <goal>removeTestStubs</goal>
      </goals>
    </execution>
  </executions>
</plugin>

  在一个spring boot工程中,新建groovy脚本文件,

def sayHello(name){
    return "Hello,$name!"
}

def sayHi(name){
    return "Hi,$name!"
}

 

 ScriptEngine方式

新建一个正常java类,交给spring 容器托管

package com.groovy;

import org.codehaus.groovy.jsr223.GroovyScriptEngineFactory;
import org.codehaus.groovy.runtime.GStringImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import java.io.InputStreamReader;

@Service
public class HelloService {

    @Autowired
    private ApplicationContext context;

    public String sayHello(String name) throws Exception {
        Resource script = context.getResource("classpath:scripts/hello.groovy");
        GroovyScriptEngineFactory factory = new GroovyScriptEngineFactory();
        ScriptEngine engine = factory.getScriptEngine();
        engine.eval(new InputStreamReader(script.getInputStream()));
        Invocable invocable = (Invocable) engine;


//      GStringImpl obj = (GStringImpl)invocable.invokeFunction("sayHello",name);
        GStringImpl obj = (GStringImpl) invocable.invokeFunction("sayHi", name);

        String ret = obj.toString();
        System.out.println(ret);
        return ret;
    }
}

 

 

写一个测试类

package org.example;

import com.groovy.HelloService;
import com.lw.service.cangbaoe.CangbaoeService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest

//@Configuration
@ComponentScan(basePackages = {"com.lw","com.groovy"})
//@ContextConfiguration(locations = {"classpath:application.properties"})
@SpringBootConfiguration
//@SpringJUnitConfig
//@TestPropertySource("classpath:application.properties")


public class SpringTest {

    @Autowired
    private HelloService helloService;

    @Test
    public void test(){
        helloService.sayHello("king");
    }
}

 

GroovyClassLoader 调用方式

public String sayHello2(String name) throws Exception {
    Resource script = context.getResource("classpath:scripts/hello.groovy");

    GroovyClassLoader classLoader = new GroovyClassLoader();
    GroovyCodeSource codeSource = new GroovyCodeSource(script.getURI());
    Class groovyClass = classLoader.parseClass(codeSource);
    GroovyObject groovyObject = (GroovyObject)groovyClass.newInstance();
    GStringImpl obj = (GStringImpl)groovyObject.invokeMethod("sayHi",name);

    String ret = obj.toString();
    System.out.println(ret);
    return ret;
}

 

GroovyShell 调用方式

private static GroovyShell shell = new GroovyShell();
public String sayHello3(String name) throws Exception {
    Resource script = context.getResource("classpath:scripts/hello.groovy");

    Script script1 = shell.parse(script.getURI());
    GStringImpl obj = (GStringImpl)InvokerHelper.invokeMethod(script1,"sayHi",name);

    String ret = obj.toString();
    System.out.println(ret);
    return ret;
}

 

标签:groovy,name,Spring,boot,springframework,context,import,org
From: https://www.cnblogs.com/weiyanei/p/18143242

相关文章

  • jeecg-boot前端v-has权限控制
    v-has是一个很方便的前端权限控制标签,目前只支持一个授权标识,如果需要两个或以上的权限与或运算就不支持了。解决:修改路径下src/utils/hasPermission.js中的 filterGlobalPermission方法原代码 修改后 代码:letvalue=binding.value//目前只支持全与、全或......
  • Spring中入参的校验方式
    在项目中,一般对于入参的校验,我们都是放在Controller层,之前是通过if语句进行空判断,但每次都这样写比较麻烦,代码写出来也不优雅。比较幸运的是Spring框架中已经给我们提供了这样的注解,我们只要添加上相应的注解,就可以进行参数的检验,而不需要写if条件语句判断了。具体的使用方法,也......
  • mybatis-plus分页插件使用(springboot)
    1、添加依赖、、、2、自定义一个配置类importcom.baomidou.mybatisplus.annotation.DbType;importcom.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;importcom.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;importorg.sp......
  • SpringBoot项目 file not present 终局!
    在写一个文件上传接口时,从一个老项目里copy出来了一个接口,死活报错filenotpresent,参考如下步骤排查确保请求的httpheader里面的文件字段名和接口定义一致如果使用postman,则确定key和接口保持一致在保证一切都是对的情况下,检查下项目是否配置了CommonsMultipartResolv......
  • Spring Boot Validation统一参数校验
    实现方式  使用 @Validated注解配合参数校验注解,比如:@NotEmpty对参数进行校验。然后对抛出的异常ControllerAdvice进行捕获然后调整输出数据。1、引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validati......
  • Spring API DOC未授权访问/SpringBoot Actuator 未授权访问测试方法
    插件安装需要先安装并配置java环境,然后在burpsuite中安装apikit插件 工具扫描1)在BurpSuite中抓取请求:你将在BurpSuite中的`Proxy`标签的`HTTPhistory`中看到所有通过代理发送的请求。2)使用APIkit进行测试:在BurpSuite中,发送想要测试的请求选择**DoAutoAPIscan**来发......
  • 微服务Spring Cloud17_微服务场景模拟4
    首先,我们需要模拟一个服务调用的场景。方便后面学习微服务架构 一、创建父工程微服务中需要同时创建多个项目,为了方便课堂演示,先创建一个父工程,然后后续的工程都以这个工程为父,实现maven的聚合。这样可以在一个窗口看到所有工程,方便讲解。在实际开发中,每个微服务可独立一个......
  • 基于K8s+Docker+Openresty+Lua+SpringCloudAlibaba的高并发秒杀系统——与京东淘宝同
    ​介绍基于K8s+Docker+Openresty+Lua+SpringCloudAlibaba的高并发高性能商品秒杀系统,本系统实测单台(16核32G主频2.2GHz)openresty(nginx)的QPS可高达6w并发,如果您需要应对100w的并发,则需要100w/6w=17台openresty服务器,17台服务器同时接收并处理这100w的并发流量呢?当然是商业......
  • bootmgfw.efi 是 Windows 操作系统中的一个关键文件,它是用于启动 UEFI(统一扩展固件接
    bootmgfw.efi是Windows操作系统中的一个关键文件,它是用于启动UEFI(统一扩展固件接口)计算机的WindowsBootManager。这个文件通常位于Windows安装的EFI系统分区(ESP)中的\EFI\Microsoft\Boot\目录下。在UEFI计算机上,bootmgfw.efi负责加载Windows操作系统的启动程......
  • springboot集成spark大数据
    1、特别申明,请注意JDK版本,最好用JDK1.8,用JDK17会导致很多报错2、导入pom依赖JDK1.8直接导入spark依赖就行。<dependency><groupId>org.apache.spark</groupId><artifactId>spark-sql_2.13</artifactId><version>3.4.1......