Spring 使用 Groovy 实现动态server

2024-05-11 16:52

本文主要是介绍Spring 使用 Groovy 实现动态server,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本人在项目中遇到这么个需求,有一个模块的server方法需要频繁修改
经阅读可以使用 Groovy 使用java脚本来时

pom坐标

<dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy</artifactId><version>3.0.9</version>
</dependency>

实例代码

public interface IGroovyHandler {List<JSONObject> transform(List<JSONObject> data);
}

动态加载

@Component
@Slf4j
public class GroovyTransformServiceImpl implements TransformStrategy {private GroovyClassLoader groovyClassLoader = new GroovyClassLoader();/*** 数据清洗转换 类型** @return*/@Overridepublic String type() {return "javaBean";}/**** 清洗转换算法接口* @param def* @param data* @return*/@Overridepublic List<JSONObject> transform(DataSetTransformDto def, List<JSONObject> data) {String transformScript = def.getTransformScript();Class<?> clazz = groovyClassLoader.parseClass(transformScript);if (clazz != null) {try {Object instance = clazz.newInstance();if (instance!=null) {if (instance instanceof IGroovyHandler) {IGroovyHandler handler = (IGroovyHandler) instance;return handler.transform(data);} else {System.err.println("转换失败!");}}} catch (Exception e) {log.info("执行javaBean异常", e);throw new RuntimeException(e.getMessage());}}return data;}
}

java 脚本 在idea中写好之后 转化成字符串 运行

package com;import com.alibaba.fastjson.JSONObject;
import com.anjiplus.template.gaea.business.modules.datasettransform.service.IGroovyHandler;import java.util.ArrayList;
import java.util.List;/*** 建议在idea写好复制整个类到此处,位置report-core/src/test/java/com/DemoGroovyHandler.java*/
public class DemoGroovyHandler implements IGroovyHandler {@Overridepublic List<JSONObject> transform(List<JSONObject> data) {for (JSONObject datum : data) {List<Double> value = new ArrayList<>();Double longitude = datum.getDouble("longitude");Double latitude = datum.getDouble("latitude");value.add(longitude);value.add(latitude);datum.put("value", value);datum.put("name", "");datum.remove("longitude")datum.remove("latitude")}return data;}
}

demo代码

import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;import java.lang.reflect.InvocationTargetException;public class GroovyTest {public static void main(String[] args) throws Exception {//test01();test02();}private static void test02() throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {GroovyClassLoader loader = new GroovyClassLoader();// java代码String java = "import java.sql.*;\n" +"import java.util.ArrayList;\n" +"import java.util.HashMap;\n" +"import java.util.List;\n" +"import java.util.Map;\n" +"\n" +"public class JDBCTest {\n" +"    \n" +"    private static List<Map> getData() {\n" +"        // 数据库URL,用户名和密码\n" +"        String url = \"jdbc:mysql://172.16.90.xxx:3306/xx\";\n" +"        String user = \"root\";\n" +"        String password = \"123456\";\n" +"\n" +"        Connection conn = null;\n" +"        Statement stmt = null;\n" +"        ResultSet rs = null;\n" +"        List<Map> data = new ArrayList<>();\n" +"        try {\n" +"            // 加载数据库驱动\n" +"            Class.forName(\"com.mysql.cj.jdbc.Driver\");\n" +"\n" +"            // 建立连接\n" +"            conn = DriverManager.getConnection(url, user, password);\n" +"\n" +"            // 创建Statement对象\n" +"            stmt = conn.createStatement();\n" +"\n" +"            // 执行查询\n" +"            rs = stmt.executeQuery(\"SELECT kdmc FROM frm_wlxx\");\n" +"\n" +"            // 获取结果集的元数据\n" +"            ResultSetMetaData rsmd = rs.getMetaData();\n" +"\n" +"            // 获取列数\n" +"            int columnsCount = rsmd.getColumnCount();\n" +"\n" +"            // 遍历每一行数据\n" +"            while (rs.next()) {\n" +"                Map obj = new HashMap();\n" +"                for (int i = 1; i <= columnsCount; i++) {\n" +"                    // 获取列名\n" +"                    String columnName = rsmd.getColumnName(i);\n" +"                    // 获取对应列的值\n" +"                    Object columnValue = rs.getObject(i);\n" +"\n" +"                    obj.put(columnName, columnValue);\n" +"\n" +"                }\n" +"                data.add(obj);\n" +"            }\n" +"            // 处理结果\n" +"//            while (rs.next()) {\n" +"//                String string = rs.getString(\"kdmc\");\n" +"\n" +"\n" +"//                String query =\"SELECT kdmc FROM frm_wlxx where kdmc=?\";\n" +"//\n" +"//                PreparedStatement pstmt = conn.prepareStatement(query);\n" +"//\n" +"//                pstmt.setString(1, string);\n" +"//\n" +"//                ResultSet child = pstmt.executeQuery();\n" +"//                while (child.next()) {\n" +"//                    String childObj = child.getString(\"kdmc\");\n" +"//                    System.out.println(childObj);\n" +"//                }\n" +"//            }\n" +"        } catch (Exception e) {\n" +"            e.printStackTrace();\n" +"        } finally {\n" +"            // 关闭资源\n" +"            try {\n" +"                if (rs != null) {\n" +"                    rs.close();\n" +"                    rs = null;\n" +"                }\n" +"                if (stmt != null) {\n" +"                    stmt.close();\n" +"                    stmt = null;\n" +"                }\n" +"                if (conn != null) {\n" +"                    conn.close();\n" +"                    conn = null;\n" +"                }\n" +"            } catch (Exception e) {\n" +"                e.printStackTrace();\n" +"            }\n" +"        }\n" +"        return data;\n" +"    }\n" +"}\n";Class scriptClass = loader.parseClass(java);GroovyObject scriptInstance = (GroovyObject) scriptClass.getDeclaredConstructor().newInstance();Object result = scriptInstance.invokeMethod("getData", new Object[]{});System.out.println("Groovy result=" + result);}private static void test01() throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {GroovyClassLoader loader = new GroovyClassLoader();// java代码String java = " " +"   public class Test { " +"      public int add(double a, double b) { " +"        double sum = a + b;  " +"         System.out.println(\"Script sum=\" + sum);  " +"         return sum.intValue(); " +"      }  " +"  } ";Class scriptClass = loader.parseClass(java);GroovyObject scriptInstance = (GroovyObject) scriptClass.getDeclaredConstructor().newInstance();Object result = scriptInstance.invokeMethod("add", new Object[]{1, 2});System.out.println("Groovy result=" + result);}}

这篇关于Spring 使用 Groovy 实现动态server的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/980114

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM