返回顶部
首页 > 资讯 > 后端开发 > JAVA >Groovy系列三 Java SpringBoot 整合 Groovy
  • 110
分享到

Groovy系列三 Java SpringBoot 整合 Groovy

grujava 2023-10-01 20:10:52 110人浏览 独家记忆
摘要

  目录 一、概述 一、在Java中使用Groovy: 二、在Groovy中使用Java: 三、几种范式的不同、优缺点 Java调用Groovy的类和方法: Groovy调用Java的类和方法:  使用GroovyShell执行Groovy

 

目录

一、概述

一、在Java中使用Groovy:

二、在Groovy中使用Java:

三、几种范式的不同、优缺点

Java调用Groovy的类和方法:

Groovy调用Java的类和方法:

 使用GroovyShell执行Groovy脚本:

使用GroovyClassLoader加载和执行Groovy脚本:

二、实战

第一步、与SpringBoot集成,引入依赖

第二步、编写groovy脚本

第三步、创建测试类使用GroovyShell演示

第四步、查看运行结果

第五步、启动SpringBoot,在Groovy脚本中通过SpringContextUtil获取SpringBoot容器中的Bean

第六步、创建容器中的Bean

第七步、访问代码

第八步、启动、接口测试

三、优化

第一步、创建Groovy脚本,使用GroovyClassLoader实现

第二步、创建Groovy调用Bean

第三步、创建GroovyClassLoader加载类

第四步、创建请求API


上两篇我们系统的学习了Groovy的基础语法和GDK,本篇咱们学习如何将Groovy和Java集成,并且学习集成到SpringBoot项目中。Groovy和Java之间有很好的集成,可以相互调用和使用对方的代码和特性。通过Groovy和Java的集成,可以充分发挥两者的优势,让开发更加灵活和高效。

一、概述

一、在Java中使用Groovy:

  1. 添加Groovy的依赖到Java项目中。
  2. 在Java代码中使用Groovy的类和脚本。Groovy代码可以直接在Java中执行,可以调用Groovy类的方法、访问其属性等。可以使用Groovyshell或GroovyClassLoader来执行Groovy脚本。

二、在Groovy中使用Java:

  1. Groovy天生支持Java,可以直接使用Java类、调用Java方法等。Groovy代码可以与Java代码混合编写。
  2. 在Groovy代码中使用Java类时,不需要额外的导入,直接使用即可。
  3. Groovy还提供了更简洁的语法和更强大的特性,例如闭包、扩展方法、动态类型等,可以更方便地编写代码。

为了实现更好的集成,可以注意以下几点:

  • 使用相同的依赖管理工具,以确保Java和Groovy项目使用的是相同的版本依赖。
  • 确保Java类被编译并将其生成的字节码文件和Groovy代码放在相同的classpath下,以便彼此访问。
  • 在使用GroovyShell或GroovyClassLoader执行Groovy脚本时,将Java类的路径包含在class path中,以便Groovy代码可以访问Java类。

三、几种范式的不同、优缺点

在Groovy和Java之间实现集成有多种方式,下面我会描述其中几种常见的方式,以及它们的不同、优缺点。

Java调用Groovy的类和方法:

  • 描述:Java可以直接通过类路径访问Groovy的类和方法,将Groovy代码视为Java代码的一部分。可以调用Groovy类的方法、访问其属性等。
  • 不同:Java可以无缝地调用Groovy类和方法,就像调用Java代码一样。
  • 优点:简单直接,Groovy与Java代码混合编写非常方便。
  • 缺点:对于Groovy独有的特性,如闭包、动态类型等,Java可能无法完全理解。

Groovy调用Java的类和方法:

  • 描述:Groovy天生支持Java,可以直接使用Java类、调用Java方法等。Groovy代码可以与Java代码混合编写,无需额外导入。
  • 不同:Groovy与Java的集成非常融洽,可以自动导入Java类,直接使用Java的语法。
  • 优点:无缝集成,可以充分利用Java的生态系统和已有的库。
  • 缺点:Groovy在某些方面可能比Java更“动态”,这意味着在一些情况下可能会有性能和类型安全性的损失。

 使用GroovyShell执行Groovy脚本:

  • 描述:在Java代码中使用GroovyShell执行Groovy脚本代码块。可以动态加载和执行Groovy脚本。
  • 不同:通过GroovyShell的evaluate方法,可以在Java中执行动态的Groovy脚本代码。
  • 优点:能够在运行时动态执行Groovy脚本,灵活性高,方便快捷。
  • 缺点:动态执行脚本可能会带来一定的性能影响,并且需要额外的语法检查。

使用GroovyClassLoader加载和执行Groovy脚本:

  • 描述:在Java中通过GroovyClassLoader加载和执行Groovy脚本,可以实现更灵活的脚本执行。
  • 不同:通过GroovyClassLoader加载Groovy脚本,可以获得对应的Class对象,并根据需要进行实例化和调用。
  • 优点:可以灵活地加载和执行Groovy脚本,并与Java代码进行交互。缺点:相对于GroovyShell,使用GroovyClassLoader需要更多的代码来实现加载和执行。

综上所述,不同的Groovy和Java集成方式具有不同的优缺点。我们可以根据具体需求选择合适的方式。使用Java调用Groovy类和方法以及Groovy调用Java类和方法是最直接、无缝的集成方式。而使用GroovyShell或GroovyClassLoader执行Groovy脚本则更灵活,适用于需要动态执行脚本的场景。

二、实战

那么接下来介绍springBoot如何集成Groovy脚本,并应用到实际开发中。

第一步、与SpringBoot集成,引入依赖

   org.codehaus.groovy   groovy-all   3.0.17   pom

第二步、编写groovy脚本

package scriptimport com.example.groovy.GroovyInvokeJavaDemoimport com.example.groovy.groovyshell.ShellGroovyDTOimport com.example.groovy.utils.SpringContextUtildef helloWord() {    return "hello groovy"}helloWord()def cal(int a, int b) {    ShellGroovyDTO dto = new ShellGroovyDTO()    dto.setA(a)    dto.setB(b)    if (b > 0) {        dto.setNum(a + b)    } else {        dto.setNum(a)    }    return dto};cal(a, b)class Globals {    static String PARAM1 = "静态变量"    static int[] arrayList = [1, 2]}def groovyInvokeJavaMethod(int a, int b) {    GroovyInvokeJavaDemo groovyInvokeJavaDemo = SprinGContextUtil.getBean("groovyInvokeJavaDemo")//    return groovyInvokeJavaDemo.groovyInvokeJava();    return groovyInvokeJavaDemo.groovyInvokeJavaParam(a, b);}groovyInvokeJavaMethod(a, b)

第三步、创建测试类使用GroovyShell演示

* // 创建GroovyShell实例

* // 创建Binding对象,用于传递参数和接收结果

* // 设置参数

* // 执行Groovy脚本

* // 获取结果

package com.example.groovy.groovyshell;import groovy.lang.Binding;import groovy.lang.GroovyShell;import groovy.lang.Script;public class GroovyShellApp {        public static void main(String[] args) {        String groovyStr = "package script\n" +                "\n" +                "import com.example.groovy.groovyshell.ShellGroovyDTO\n" +                "\n" +                "\n" +                "\n" +                "def helloWord() {\n" +                "    return \"hello groovy\"\n" +                "}\n" +                "\n" +                "helloWord()\n" +                "\n" +                "def cal(int a, int b) {\n" +                "    ShellGroovyDTO dto = new ShellGroovyDTO()\n" +                "    dto.setA(a)\n" +                "    dto.setB(b)\n" +                "    if (b > 0) {\n" +                "        dto.setNum(a + b)\n" +                "    } else {\n" +                "        dto.setNum(a)\n" +                "    }\n" +                "    return dto\n" +                "};\n" +                "\n" +                "cal(a , b)";        // 创建GroovyShell实例        GroovyShell shell = new GroovyShell();        Script script = shell.parse(groovyStr);        Object helloWord = script.invokeMethod("helloWord", null);        System.out.println(helloWord);    }    //    public static void main(String[] args) {////        String groovyStr = "package script\n" +//                "\n" +//                "import com.example.groovy.groovyshell.ShellGroovyDTO\n" +//                "\n" +//                "\n" +//                "def cal(int a, int b) {\n" +//                "    ShellGroovyDTO dto = new ShellGroovyDTO()\n" +//                "    dto.setA(a)\n" +//                "    dto.setB(b)\n" +//                "    if (b > 0) {\n" +//                "        dto.setNum(a + b)\n" +//                "    } else {\n" +//                "        dto.setNum(a)\n" +//                "    }\n" +//                "    return dto\n" +//                "};\n" +//                "\n" +//                "cal(a, b)";////        // 创建Binding对象,用于传递参数和接收结果//        Binding binding = new Binding();////        // 创建GroovyShell实例//        GroovyShell shell = new GroovyShell(binding);//////        // 设置参数//        binding.setVariable("a", 10);//        binding.setVariable("b", 20);////        // 执行Groovy脚本//        Object result = shell.evaluate(groovyStr);////        // 获取结果//        ShellGroovyDTO dto = (ShellGroovyDTO) result;//        System.out.println(dto);//    }}package com.example.groovy.groovyshell;import lombok.AllArgsConstructor;import lombok.Builder;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor@NoArgsConstructor@Builderpublic class ShellGroovyDTO {    private Integer a;    private Integer b;    private Integer num;}

第四步、查看运行结果

第五步、启动SpringBoot,在Groovy脚本中通过SpringContextUtil获取SpringBoot容器中的Bean

上面几步都是纯Java代码中调用Groovy,其实在开发的过程中,我们通常会Groovy和Java代码互调,接下来咱们看看如何使实现Groovy中通过SpringContextUtil获取SpringBoot容器中的Bean并且调用目标方法。

package com.example.groovy.utils;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.stereotype.Service;@Servicepublic class SpringContextUtil implements ApplicationContextAware {    private static ApplicationContext applicationContext;    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        SpringContextUtil.applicationContext = applicationContext;    }    public static ApplicationContext getApplicationContext() {        return applicationContext;    }        public static Object getBean(String name) {        return getApplicationContext().getBean(name);    }        public static  T getBean(Class clazz) {        return getApplicationContext().getBean(clazz);    }        public static  T getBean(String name, Class clazz) {        return getApplicationContext().getBean(name, clazz);    }}

第六步、创建容器中的Bean

咱们创建一个“GroovyInvokeJavaDemo“bean,并交给Spring管理。其中有两个目标方法,一个是需要参数的,一个不需要参数,需要参数的咱们通过Java调用Groovy的时候传入的参数在Groovy中调用Java方法的时候传入。

package com.example.groovy;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Service;import java.util.ArrayList;import java.util.List;@Service@Slf4jpublic class GroovyInvokeJavaDemo {    public String groovyInvokeJava() {        List lits = new ArrayList<>();        log.info("this is SpringBoot class, groovy script invoke this method ...");        return "this is SpringBoot class, groovy script invoke this method ...";    }    public String groovyInvokeJavaParam(int a, int b) {        List lits = new ArrayList<>();        log.info("this is SpringBoot class, groovy script invoke this method ,param is a:{}, b:{}", a, b);        return "this is SpringBoot class, groovy script invoke this method , a:" + a + ", b:" + b;    }}

第七步、访问代码

package com.example.groovy;import com.example.groovy.classloader.GroovyClassLoaderRule;import groovy.lang.Binding;import groovy.lang.GroovyShell;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@RestController@RequestMapping("/groovy")public class GroovyInvokeJavaSpringController {    @Resource    private GroovyClassLoaderRule groovyClassLoaderRule;    @RequestMapping("/groovy-shell/spring")    public String groovyInvokeJavaMethodTest() {        String groovyStr = "package script\n" +                "\n" +                "import com.example.groovy.GroovyInvokeJavaDemo\n" +                "import com.example.groovy.groovyshell.ShellGroovyDTO\n" +                "import com.example.groovy.utils.SpringContextUtil\n" +                "\n" +                "\n" +                "\n" +                "def helloWord() {\n" +                "    return \"hello groovy\"\n" +                "}\n" +                "\n" +                "helloWord()\n" +                "\n" +                "def cal(int a, int b) {\n" +                "    ShellGroovyDTO dto = new ShellGroovyDTO()\n" +                "    dto.setA(a)\n" +                "    dto.setB(b)\n" +                "    if (b > 0) {\n" +                "        dto.setNum(a + b)\n" +                "    } else {\n" +                "        dto.setNum(a)\n" +                "    }\n" +                "    return dto\n" +                "};\n" +                "\n" +                "cal(a , b)\n" +                "\n" +                "\n" +                "class Globals {\n" +                "    static String PARAM1 = \"静态变量\"\n" +                "    static int[] arrayList = [1, 2]\n" +                "}\n" +                "\n" +                "def groovyInvokeJavaMethod(int a, int b) {\n" +                "    GroovyInvokeJavaDemo groovyInvokeJavaDemo = SpringContextUtil.getBean(\"groovyInvokeJavaDemo\")\n" +                "//    return groovyInvokeJavaDemo.groovyInvokeJava();\n" +                "    return groovyInvokeJavaDemo.groovyInvokeJavaParam(a, b);\n" +                "}\n" +                "\n" +                "groovyInvokeJavaMethod(a, b)";        Binding binding = new Binding();        binding.setVariable("a", 100);        binding.setVariable("b", 100);        GroovyShell groovyShell = new GroovyShell(binding);        Object evaluate = groovyShell.evaluate(groovyStr);        groovyShell.getClassLoader().clearCache();        return (String) evaluate;    }}

第八步、启动、接口测试

访问“http://localhost:8080/groovy/groovy-shell/spring”即可看到效果。

三、优化

以上我们就将Groovy集成到Java中来了,但是上面的代码有很大的问题,主要体现在两个方面:

第一个方面:通过第五步中我们可以看到,在Groovy中是可以获取到SpringBoot容器对象的,能拿到容器对象就可以获取到容器中所有的东西。这虽然很方便、灵活,但是非常的危险。如果没有做好权限控制,Groovy脚本将会成为攻击你系统最有力的武器!

第二个方面:Groovy脚本用不好,会导致OOM,最终服务器宕机。每次调用这个方法都创建了GroovyShell、Script等实例,随着调用次数的增加,必然会出现OOM。

解决方案是通过GroovyClassLoader的clearCache()函数在调用完毕销毁GroovyShell、Script等实例,但是其实这样仅仅是不够的,导致OOM的原因并不止GroovyShell、Script等实例过多,经过查阅资料得知,如果脚本中的Java代码也创建了对象或者new了实例,即使销毁了GroovyShell也不会销毁脚本中的对象。所以Groovy代码最好是使用缓存管理。

第一步、创建Groovy脚本,使用GroovyClassLoader实现

GroovyClassLoad_1.groovy

package scriptimport com.example.groovy.GroovyInvokeJavaDemoimport com.example.groovy.groovyshell.ShellGroovyDTOimport com.example.groovy.utils.SpringContextUtildef groovyInvokeJavaMethod(int a, int b) {    GroovyInvokeJavaDemo groovyInvokeJavaDemo = SpringContextUtil.getBean("groovyInvokeJavaDemo")//    return groovyInvokeJavaDemo.groovyInvokeJava();    return groovyInvokeJavaDemo.groovyInvokeJavaParam(a, b)}groovyInvokeJavaMethod(a, b)

GroovyClassLoad_2.groovy

package scriptimport com.example.groovy.GroovyInvokeJavaDemoimport com.example.groovy.groovyshell.ShellGroovyDTOimport com.example.groovy.utils.SpringContextUtildef groovyInvokeJavaMethod(int a, int b) {    GroovyInvokeJavaDemo groovyInvokeJavaDemo = SpringContextUtil.getBean("groovyInvokeJavaDemo")//    return groovyInvokeJavaDemo.groovyInvokeJava();    return groovyInvokeJavaDemo.groovyInvokeJavaParam(a, b)}groovyInvokeJavaMethod(a, b)

第二步、创建Groovy调用Bean

package com.example.groovy;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Service;import java.util.ArrayList;import java.util.List;@Service@Slf4jpublic class GroovyInvokeJavaDemo {    public String groovyInvokeJava() {        List lits = new ArrayList<>();        log.info("this is SpringBoot class, groovy script invoke this method ...");        return "this is SpringBoot class, groovy script invoke this method ...";    }    public String groovyInvokeJavaParam(int a, int b) {        List lits = new ArrayList<>();        log.info("this is SpringBoot class, groovy script invoke this method ,param is a:{}, b:{}", a, b);        return "this is SpringBoot class, groovy script invoke this method , a:" + a + ", b:" + b;    }}

第三步、创建GroovyClassLoader加载类

package com.example.groovy.classloader;public interface GroovyClassLoaderRule {    String run();}
package com.example.groovy.classloader;import groovy.lang.Binding;import groovy.lang.GroovyClassLoader;import groovy.lang.GroovyObject;import groovy.lang.Script;import lombok.extern.slf4j.Slf4j;import org.apache.groovy.parser.antlr4.util.StringUtils;import org.codehaus.groovy.runtime.InvokerHelper;import org.springframework.stereotype.Service;import javax.annotation.Resource;import java.util.HashMap;import java.util.Map;@Slf4j@Servicepublic class GroovyClassLoaderRuleImpl implements GroovyClassLoaderRule {        private static final Map SCRIPT_MAP = new HashMap<>();    private static final GroovyClassLoader CLASS_LOADER = new GroovyClassLoader();    public static GroovyObject loadScript(String key, String rule) {        if (SCRIPT_MAP.containsKey(key)) {            return SCRIPT_MAP.get(key);        }        GroovyObject groovyObject = loadScript(rule);        SCRIPT_MAP.put(key, groovyObject);        return groovyObject;    }    public static GroovyObject loadScript(String rule) {        if (StringUtils.isEmpty(rule)) {            return null;        }        try {            Class ruleClazz = CLASS_LOADER.parseClass(rule);            if (ruleClazz != null) {                log.info("load rule:" + rule + " success!");                GroovyObject groovyObject = (GroovyObject) ruleClazz.newInstance();                return groovyObject;            }        } catch (Exception e) {            log.error(e.getMessage(), e);        } finally {            CLASS_LOADER.clearCache();        }        log.error("load rule error, can not load Script");        return null;    }    @Override    public String run() {        // 业务逻辑执行,方便配置        String groovyClassLoader1 = "package script\n" +                "\n" +                "import com.example.groovy.GroovyInvokeJavaDemo\n" +                "import com.example.groovy.groovyshell.ShellGroovyDTO\n" +                "import com.example.groovy.utils.SpringContextUtil\n" +                "\n" +                "\n" +                "\n" +                "def groovyInvokeJavaMethod(int a, int b) {\n" +                "    GroovyInvokeJavaDemo groovyInvokeJavaDemo = SpringContextUtil.getBean(\"groovyInvokeJavaDemo\")\n" +                "//    return groovyInvokeJavaDemo.groovyInvokeJava();\n" +                "\n" +                "    return groovyInvokeJavaDemo.groovyInvokeJavaParam(a, b)\n" +                "}\n" +                "\n" +                "groovyInvokeJavaMethod(a, b)";        String groovyClassLoader2 = "package script\n" +                "\n" +                "import com.example.groovy.GroovyInvokeJavaDemo\n" +                "import com.example.groovy.groovyshell.ShellGroovyDTO\n" +                "import com.example.groovy.utils.SpringContextUtil\n" +                "\n" +                "\n" +                "\n" +                "def groovyInvokeJavaMethod(int a, int b) {\n" +                "    GroovyInvokeJavaDemo groovyInvokeJavaDemo = SpringContextUtil.getBean(\"groovyInvokeJavaDemo\")\n" +                "//    return groovyInvokeJavaDemo.groovyInvokeJava();\n" +                "\n" +                "    return groovyInvokeJavaDemo.groovyInvokeJavaParam(a, b)\n" +                "}\n" +                "\n" +                "groovyInvokeJavaMethod(a, b)";        Binding binding = new Binding();        binding.setVariable("a", 300);        binding.setVariable("b", 400);//        Script classLoader1 = loadScript("groovyClassLoader1", groovyClassLoader1, binding);        GroovyObject groovyObject = loadScript("groovyClassLoader2", groovyClassLoader2);        Object groovyInvokeJavaMethod = groovyObject.invokeMethod("groovyInvokeJavaMethod", new Object[]{100, 200});        return (String) groovyInvokeJavaMethod;    }}

第四步、创建请求api

@RequestMapping("/groovy-class-loader/spring")public String groovyClassLoaderRuleTest() {    String result = groovyClassLoaderRule.run();    return result;}

第五步、启动验证

至此,咱们的Groovy系列就结束啦,代码大家需要的话可以访问我的GitHub网站获取或者留言,我私信发给大家,希望可以帮助到大家。

https://github.com/576403061lly/groovy

来源地址:https://blog.csdn.net/lly576403061/article/details/131505699

--结束END--

本文标题: Groovy系列三 Java SpringBoot 整合 Groovy

本文链接: https://lsjlt.com/news/422425.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Groovy系列三 Java SpringBoot 整合 Groovy
      目录 一、概述 一、在Java中使用Groovy: 二、在Groovy中使用Java: 三、几种范式的不同、优缺点 Java调用Groovy的类和方法: Groovy调用Java的类和方法:  使用GroovyShell执行Groovy...
    99+
    2023-10-01
    gru java
  • SpringBoot整合Groovy脚本实现动态编程详解
    目录Groovy简介应用场景集成与使用第一步、与SpringBoot集成1、pom.xml文件如下:第二步、写出Groovy版本的“Hello World”1...
    99+
    2024-04-02
  • Springboot整合Rocketmq系列教程
    Springboot整合Rocketmq系列教程 本教程是基于Springboot2.6.3整合Rocketmq5.0,其中涉及了Rocketmq的安装,消息的发送及消费的代码实现。 本文不会对roc...
    99+
    2023-10-07
    spring boot java-rocketmq rocketmq
  • Java中的Gradle与Groovy的区别及存在的关系
    目录一、Gradle构建的利与弊二、Groovy的优点三、依存关系四、认识build.gradle五、Gradlebuildscript六、什么是闭包七、Gradle只是闭包八、探索...
    99+
    2024-04-02
  • Java SpringBoot整合SpringCloud
    目录1. SpringCloud特点2. 分布式系统的三个指标CAP3. Eureka4. SpringCloud Demo4.1 registry4.2 api4.3 provid...
    99+
    2024-04-02
  • Redis系列(三)Redis的事务和Spring Boot整合
    NoSQL 开发中或多或少都会用到,也是面试必问知识点。最近这几天的面试每一场都问到了。但是感觉回答的并不好,还有很多需要梳理的知识点。这里通过几篇 Redis 笔记整个梳理一遍,后面再加上面试题。 Redis 系列: ...
    99+
    2017-07-11
    Redis系列(三)Redis的事务和Spring Boot整合
  • springboot整合消息队列RabbitMQ
    前言: RabbitMQ常用的三种Exchange Type:fanout、direct、topic。 fanout:把所有发送到该Exchange的消息投递到所有与它绑定的队列中。...
    99+
    2024-04-02
  • springboot整合redis之消息队列
    目录一、项目准备二、配置类三、redis中list数据类型定时器监听队列运行即监控队列四、发布/订阅模式五、ZSet实现延迟队列一、项目准备 依赖 <!-- R...
    99+
    2024-04-02
  • Java SpringBoot如何整合ActiveMQ
    Java SpringBoot如何整合ActiveMQ,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、 如果要想在项目之中去使用 ActiveMQ 组件,则应...
    99+
    2023-06-05
  • SpringBoot整合rockerMQ消息队列详解
    目录Springboot整合RockerMQ使用总结消费模式生产者组和消费者组生产者投递消息的三种方式如何保证消息不丢失顺序消息分布式事务Springboot整合RockerMQ 1...
    99+
    2024-04-02
  • SpringBoot整合第三方技术的实现
    目录整合JunitSpringBoot整合MyBatis整合Junit 在Boot环境下如何进行单元测设 注解:@SpringBootTest类型:测试类注解位置:测试类上方作用:设...
    99+
    2023-02-06
    SpringBoot整合第三方 SpringBoot第三方整合
  • SpringBoot整合RabbitMQ消息队列的完整步骤
    SpringBoot整合RabbitMQ 主要实现RabbitMQ以下三种消息队列: 简单消息队列(演示direct模式) 基于RabbitMQ特性的延时消息队列 ...
    99+
    2024-04-02
  • Java基础之SpringBoot整合knife4j
    插件的特点 1、非常简洁清爽的UI设计,接口的快速搜索。 2、支持个性化设置,个性化设置包含: 请求参数缓存 动态请求参数 RequestMapping接口过滤 ...
    99+
    2024-04-02
  • Java中SpringBoot如何整合RabbitMQ
    这篇文章主要为大家展示了“Java中SpringBoot如何整合RabbitMQ”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中SpringBoot如何整合RabbitMQ”这篇文章吧。...
    99+
    2023-06-05
  • SpringBoot怎么整合Redis实现序列化存储Java对象
    今天小编给大家分享一下SpringBoot怎么整合Redis实现序列化存储Java对象的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-07-05
  • springboot整合系列之如何选择版本及项目搭建
    特别说明:本次项目整合基于idea进行的,如果使用Eclipse可能操作会略有不同,不过总的来说不影响。 springboot整合之如何选择版本及项目搭建 springboot整合之版本号统一管理   springboot整合mybatis...
    99+
    2023-09-05
    spring boot java 数据库
  • SpringBoot整合第三方技术的详细步骤
    目录SpringBoot整合第三方技术一、整合Junit二、整合Mybatis三、整合Mybatis-Plus四、整合Druid五、总结SpringBoot整合第三方技术 一、整合J...
    99+
    2024-04-02
  • SpringBoot怎么整合ActiveMQ实现秒杀队列
    本文小编为大家详细介绍“SpringBoot怎么整合ActiveMQ实现秒杀队列”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot怎么整合ActiveMQ实现秒杀队列”文章能帮助大家解决疑...
    99+
    2024-04-02
  • SpringBoot整合RabbitMQ处理死信队列和延迟队列
    目录简介实例代码路由配置控制器发送器接收器application.yml实例测试简介 说明 本文用示例介绍SpringBoot整合RabbitMQ时如何处理死信队列/延迟队列。 Ra...
    99+
    2024-04-02
  • Java springboot 整合 Nacos的实例代码
    Nacos注册中心使用 1)工程添加依赖包 <!-- nacos注册中心依赖包 --> <dependency> <groupId>c...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作