【RabbitMQ】整合 SpringBoot,實現工作隊列、發布/訂閱、路由和通配符模式

文章目錄

  • 工作隊列模式
    • 引入依賴
    • 配置
    • 聲明
    • 生產者代碼
    • 消費者代碼
  • 發布/訂閱模式
    • 引入依賴
    • 聲明
    • 生產者代碼
      • 發送消息
    • 消費者代碼
    • 運行程序
  • 路由模式
    • 聲明
    • 生產者代碼
    • 消費者代碼
    • 運行程序
  • 通配符模式
    • 聲明
    • 生產者代碼
    • 消費者代碼
    • 運行程序

工作隊列模式

引入依賴

我們在創建 SpringBoot 項目的時候,選上這兩個依賴即可 |380

或者在依賴中加入

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-amqp</artifactId>  
</dependency>

配置

將配置文件后綴改成 yml 之后,進行配置image.png|372

#配置 RabbitMQ 的基本信息
spring:rabbitmq:  host: 127.0.0.1 #RabbitMQ 服務器的地址  port: 15673  #RabbitMQ的TCP協議的端口號,而不是管理平臺的端口號。默認為5672  username: guest  password: guest  virtual-host: coding #默認為 /

或者這樣寫

spring:rabbitmq:addresses: amqp://guest:guest@127.0.0.1:5672/coding
  • 格式為: amqp://username:password@ip:port/virtual-host

聲明

注意引入的是這個包
image.png

package org.example.rabbitmq.config;  import org.example.rabbitmq.constant.Constants;  
import org.springframework.amqp.core.Queue;  
import org.springframework.amqp.core.QueueBuilder;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  @Configuration  
public class RabbitMQConfig {  // 聲明一個隊列,來自第三方包,就是一個對象  @Bean("workQueue")  public Queue workQueue(){  return QueueBuilder.durable(Constants.WORK_QUEUE).build();  }  
}

生產者代碼

package org.example.rabbitmq.controller;  import org.example.rabbitmq.constant.Constants;  
import org.springframework.amqp.rabbit.core.RabbitTemplate;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RestController;  @RestController  
@RequestMapping("/producer")  
public class ProducerController {  @Autowired  private RabbitTemplate rabbitTemplate;  @RequestMapping("/work")  public String work() {  // 使用內置交換機的話,RoutingKey 和隊列名稱一致  rabbitTemplate.convertAndSend("", Constants.WORK_QUEUE, "hello spring amqp: work...");  return "發送成功";  }  
}
  • 在運行程序之后,隊列不會被立馬創建出來
  • 需要發送消息之后才會被創建image.png|278

消費者代碼

消費者是通過實現一個監聽類,來監聽有沒有消息

  • 采用一個注解—— @RabbitListener

@RabbitListenerSpring 框架中用于監聽 RabbitMQ 隊列的注解,通過使用這個注解,可以定義一個方法,以便從 RabbitMQ 隊列中接收消息。

  • 該注解支持多種參數類型,這些參數類型代表了從 RabbitMQ 接收到的消息和相關信息
  • 以下是一些常用的參數類型:
    • String:返回消息的內容
    • Message (org.spring.framework.ampq.core.Message):Spring AMPQMessage 類,返回原始的消息體以及消息的屬性,如消息 ID,內容,隊列信息等
    • Channel (com.rabbitmq.client.Channel):RabbitMQ 的通道對象,可以用于進行高級的操作,如手動確認消息
package org.example.rabbitmq.listener;  import org.apache.logging.log4j.message.Message;  
import org.example.rabbitmq.constant.Constants;  
import org.springframework.amqp.rabbit.annotation.RabbitListener;  
import org.springframework.stereotype.Component;  @Component  
public class WorkListener {  @RabbitListener(queues = Constants.WORK_QUEUE)  public void queueListener1(Message message) {  System.out.println("listener 1 [" + Constants.WORK_QUEUE + "] 接收到消息:" + message);  }  @RabbitListener(queues = Constants.WORK_QUEUE)  public void queueListener2(String message) {  System.out.println("listener 2 [" + Constants.WORK_QUEUE + "] 接收到消息:" + message);  }  
}

發布/訂閱模式

在發布/訂閱模式中,多了一個 Exchange 角色。Exchange 常見有三種類型,分別代表不同的路由規則

  • Fanout: 廣播,將消息交給所有綁定到交換機的隊列 (Publish/Subscribe 模式)
  • Direct: 定向,把消息交給符合指定 Routing Key 的隊列(Routing 模式)
  • Topic: 通配符,把消息交給符合 Routing pattern (路由模式) 的隊列(Topics 模式)

引入依賴

我們在創建 SpringBoot 項目的時候,選上這兩個依賴即可 |380

或者在依賴中加入

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-amqp</artifactId>  
</dependency>

聲明

package org.example.rabbitmq.config;  import org.example.rabbitmq.constant.Constants;  
import org.springframework.amqp.core.*;  
import org.springframework.beans.factory.annotation.Qualifier;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  @Configuration  
public class RabbitMQConfig {  /**  * 二、發布/訂閱模式  * 聲明隊列、聲明交換機、聲明隊列和交換機的綁定  * @return  */  @Bean("fanoutQueue1")  // @Bean注解:交給Spring進行管理, 括號里面是指定名稱  public Queue fanoutQueue1() {  return QueueBuilder.durable(Constants.FANOUT_QUEUE1).build();  }  @Bean("fanoutQueue2")  public Queue fanoutQueue2() {  return QueueBuilder.durable(Constants.FANOUT_QUEUE2).build();  }  @Bean("fanoutExchange")  // 聲明交換機有很多種類型:FanoutExchange、DirectExchange、TopicExchange  public FanoutExchange fanoutExchange() {  return ExchangeBuilder.fanoutExchange(Constants.FANOUT_EXCHANGE).durable(true).build();  }  @Bean("fanoutQueueBinding1")  public Binding fanoutQueueBinding1(@Qualifier("fanoutExchange") FanoutExchange fanoutExchange, @Qualifier("fanoutQueue1") Queue queue) {  return BindingBuilder.bind(queue).to(fanoutExchange);  }  @Bean("fanoutQueueBinding2")  public Binding fanoutQueueBinding2(@Qualifier("fanoutExchange") FanoutExchange fanoutExchange, @Qualifier("fanoutQueue2") Queue queue) {  return BindingBuilder.bind(queue).to(fanoutExchange);  }  
}

生產者代碼

image.png|276

  1. 聲明隊列
  2. 聲明交換機
  3. 聲明交換機和隊列的綁定
  4. 發送消息

發送消息

package org.example.rabbitmq.controller;  import org.example.rabbitmq.constant.Constants;  
import org.springframework.amqp.rabbit.core.RabbitTemplate;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RestController;  @RestController  
@RequestMapping("/producer")  
public class ProducerController {  @Autowired  private RabbitTemplate rabbitTemplate;  @RequestMapping("/fanout")  public String fanout() {  rabbitTemplate.convertAndSend(Constants.FANOUT_EXCHANGE,"","hello spring amqp:fanout...");  return "發送成功";  }  
}

消費者代碼

package org.example.rabbitmq.listener;  import org.example.rabbitmq.constant.Constants;  
import org.springframework.amqp.rabbit.annotation.RabbitListener;  
import org.springframework.stereotype.Component;  @Component  
public class FanoutListener {  @RabbitListener(queues = Constants.FANOUT_QUEUE1)  public void queueListener1(String message) {  System.out.println("隊列[" + Constants.FANOUT_QUEUE1 + "] 接收到消息:" + message);  }  @RabbitListener(queues = Constants.FANOUT_QUEUE2)  public void queueListener2(String message) {  System.out.println("隊列[" + Constants.FANOUT_QUEUE2 + "] 接收到消息:" + message);  }  
}

運行程序

  1. 運行項目,調用接口發送消息
    • http://127.0.0.1:8080/producer/fanout
    • image.png

image.png

  1. 監聽類收到消息,并打印
    image.png

路由模式

交換機類型為 Direct 時,會把消息交給符合指定 Routing Key 的隊列

  • 隊列和交換機的綁定,不是任意的綁定了,而是要制定一個 RoutingKey(路由 key
  • 消息的發送方在向 Exchange 發送消息時,也需要指定消息的 RoutingKey
  • Exchange 也不再把消息交給每一個綁定的 key,而是根據消息的 RoutingKey 進行判斷,只有隊列的 RoutingKey 和消息的 RoutingKey 完全一致,才會接收消息

image.png|315

聲明

按照這個圖片,進行綁定image.png|385

/**  * 三、 路由模式  * 聲明隊列、聲明交換機、聲明隊列和交換機的綁定  * @return  */  
@Bean("directQueue1")  
public Queue directQueue1(){  return QueueBuilder.durable(Constants.DIRECT_QUEUE1).build();  
}  @Bean("directQueue2")  
public Queue directQueue2(){  return QueueBuilder.durable(Constants.DIRECT_QUEUE2).build();  
}  @Bean("directExchange")  
// 聲明交換機有很多種類型:FanoutExchange、DirectExchange、TopicExchange  
public DirectExchange directExchange() {  return ExchangeBuilder.directExchange(Constants.DIRECT_EXCHANGE).durable(true).build();  
}  @Bean("directQueueBinding1")  
public Binding directQueueBinding1(@Qualifier("directExchange") DirectExchange directExchange,@Qualifier("directQueue1") Queue queue) {  return BindingBuilder.bind(queue).to(directExchange).with("a");  
}  @Bean("directQueueBinding2")  
public Binding directQueueBinding2(@Qualifier("directExchange") DirectExchange directExchange,@Qualifier("directQueue2") Queue queue) {  return BindingBuilder.bind(queue).to(directExchange).with("a");  
}  @Bean("directQueueBinding3")  
public Binding directQueueBinding3(@Qualifier("directExchange") DirectExchange directExchange,@Qualifier("directQueue2") Queue queue) {  return BindingBuilder.bind(queue).to(directExchange).with("b");  
}  @Bean("directQueueBinding4")  
public Binding directQueueBinding4(@Qualifier("directExchange") DirectExchange directExchange,@Qualifier("directQueue2") Queue queue) {  return BindingBuilder.bind(queue).to(directExchange).with("c");  
}

生產者代碼

package org.example.rabbitmq.controller;  import org.example.rabbitmq.constant.Constants;  
import org.springframework.amqp.rabbit.core.RabbitTemplate;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.web.bind.annotation.PathVariable;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RestController;  @RestController  
@RequestMapping("/producer")  
public class ProducerController {  @Autowired  private RabbitTemplate rabbitTemplate;  /**  * 三、路由模式  * @param routingKey  * @return  */  @RequestMapping("/direct/{routingKey}")  //從路徑中拿到這個routingKey  public String direct(@PathVariable("routingKey") String routingKey) {  rabbitTemplate.convertAndSend(Constants.DIRECT_EXCHANGE, routingKey,"hello spring amqp:direct, my routing key is" + routingKey);  return "發送成功";  }  
}

消費者代碼

package org.example.rabbitmq.listener;  import org.example.rabbitmq.constant.Constants;  
import org.springframework.amqp.rabbit.annotation.RabbitListener;  
import org.springframework.stereotype.Component;  @Component  
public class DirectListener {  @RabbitListener(queues = Constants.DIRECT_QUEUE1)  public void queueListener1(String message) {  System.out.println("隊列[" + Constants.DIRECT_QUEUE1 + "] 接收到消息:" + message);  }  @RabbitListener(queues = Constants.DIRECT_QUEUE2)  public void queueListener2(String message) {  System.out.println("隊列[" + Constants.DIRECT_QUEUE2 + "] 接收到消息:" + message);  }  
}

運行程序

  1. 運行項目

  2. 調用接口發送 routingKeya 的消息

    • http://127.0.0.1:8080/producer/direct/a
    • 觀察后端日志,隊列 1 和 2 都收到消息 image.png
  3. 調用接口發送 routingKeyb 的消息

    • http://127.0.0.1:8080/producer/direct/b
    • 觀察后端日志,隊列 2 收到消息image.png|347
  4. 調用接口發送 routingKeyc 的消息

    • http://127.0.0.1:8080/producer/direct/c
    • 觀察后端日志,隊列 2 收到消息|372

通配符模式

TopicsRouting 模式的區別是:

  1. topics 模式使用的交換機類型為 topicRouting 模式使用的是 direct
  2. topic 類型的交換機在匹配規則上進行了擴展,Binding Key 支持通配符匹配

image.png|419

  • * 表示一個單詞
  • # 表示多個單詞

聲明

/**  * 四、通配符模式  * 聲明隊列、聲明交換機、聲明隊列和交換機的綁定  * @return  */  
@Bean("topicQueue1")  
public Queue topicQueue1(){  return QueueBuilder.durable(Constants.TOPIC_QUEUE1).build();  
}  @Bean("topicQueue2")  
public Queue topicQueue2(){  return QueueBuilder.durable(Constants.TOPIC_QUEUE2).build();  
}  @Bean("topicExchange")  
public TopicExchange topicExchange() {  return ExchangeBuilder.topicExchange(Constants.TOPIC_EXCHANGE).durable(true).build();  
}  @Bean("topicQueueBinding1")  
public Binding topicQueueBinding1(@Qualifier("topicExchange") TopicExchange topicExchange,@Qualifier("topicQueue1") Queue queue) {  return BindingBuilder.bind(queue).to(topicExchange()).with("*.a.*");  
}  @Bean("topicQueueBinding2")  
public Binding topicQueueBinding2(@Qualifier("topicExchange") TopicExchange topicExchange,@Qualifier("topicQueue2") Queue queue) {  return BindingBuilder.bind(queue).to(topicExchange()).with("*.*.b");  
}  @Bean("topicQueueBinding3")  
public Binding topicQueueBinding3(@Qualifier("topicExchange") TopicExchange topicExchange,@Qualifier("topicQueue2") Queue queue) {  return BindingBuilder.bind(queue).to(topicExchange()).with("c.#");  
}

生產者代碼

package org.example.rabbitmq.controller;  import org.example.rabbitmq.constant.Constants;  
import org.springframework.amqp.rabbit.core.RabbitTemplate;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.web.bind.annotation.PathVariable;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RestController;  @RestController  
@RequestMapping("/producer")  
public class ProducerController {  @Autowired  private RabbitTemplate rabbitTemplate;  /**  * 四、通配符模式  * @param routingKey  * @return  */  @RequestMapping("/topic/{routingKey}")  public String topic(@PathVariable("routingKey") String routingKey) {  rabbitTemplate.convertAndSend(Constants.TOPIC_EXCHANGE,routingKey, "hello spring amqp:topic, my routing key is " + routingKey);  return "發送成功";  }  
}

消費者代碼

運行程序

  1. 運行程序

  2. 調用接口發送 routingKeyqqq.a.b 的消息

    • http://127.0.0.1:8080/producer/topic/qqq.a.b
    • 觀察后端日志,隊列 1 和隊列 2 均收到消息image.png|435
  3. 調用接口發送 routingKeyc.abc.fff 的消息

    • http://127.0.0.1:8080/producer/topic/c.abc.fff
    • 觀察后端日志,隊列 2 收到信息image.png
  4. 調用接口發送 routingKeyg.h.j 的消息

    • http://127.0.0.1:8080/producer/topic/g.h.j
    • 觀察后端日志,沒有隊列收到消息

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81255.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81255.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81255.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python-92:最大乘積區間問題

問題描述 小R手上有一個長度為 n 的數組 (n > 0)&#xff0c;數組中的元素分別來自集合 [0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]。小R想從這個數組中選取一段連續的區間&#xff0c;得到可能的最大乘積。 你需要幫助小R找到最大乘積的區間&#xff0c;并輸出這…

windows觸摸板快捷指南

以下是結構化整理后的觸控手勢說明&#xff0c;采用清晰的層級劃分和標準化表述&#xff1a; **觸控手勢操作規范****1. 單指操作****2. 雙指操作****3. 三指操作****4. 四指操作** **優化說明&#xff1a;** 觸控手勢操作規范 1. 單指操作 手勢功能描述等效操作單擊滑動選擇…

VSCode launch.json 配置參數詳解

使用 launch.json 配置調試環境時&#xff0c;會涉及到多個參數&#xff0c;用于定義調試器的行為和目標執行環境。以下是一些常用的配置參數&#xff1a; 1、"type" &#xff1a;指定調試器的類型&#xff0c;例如 "node" 表示 Node.js 調試器&#xff0…

mAP、AP50、AR50:目標檢測中的核心評價指標解析

在目標檢測任務中&#xff0c;評價指標是衡量模型性能的核心工具。其中&#xff0c;mAP&#xff08;mean Average Precision&#xff09;、AP50&#xff08;Average Precision at IoU0.5&#xff09;和AR50&#xff08;Average Recall at IoU0.5&#xff09;是最常用的指標。本…

【論文閱讀】A Survey on Multimodal Large Language Models

目錄 前言一、 背景與核心概念1-1、多模態大語言模型&#xff08;MLLMs&#xff09;的定義 二、MLLMs的架構設計2-1、三大核心模塊2-2、架構優化趨勢 三、訓練策略與數據3-1、 三階段訓練流程 四、 評估方法4-1、 閉集評估&#xff08;Closed-set&#xff09;4-2、開集評估&…

[已解決] LaTeX “Unicode character“ 報錯 (中文字符處理)

問題&#xff1a; 寫 LaTeX 文檔&#xff0c;特別是包含中文時&#xff0c;經常遇到類似下圖的 “Unicode character XXXXXX” 報錯 (X) Unicode character 本 (U672C) LaTeX [行 xx, 列 x] (X) Unicode character 報 (U62A5) LaTeX [行 xx, 列 x] ...這通常意味著我們的 LaTe…

現貨黃金跌破 3160 美元,市場行情劇烈波動?

在 5 月 16 日的交易時段中&#xff0c;現貨黃金市場出現戲劇性變化&#xff0c;價格短時間內大幅跳水。截至當日 20:04&#xff0c;現貨黃金短線下挫 20 美元&#xff0c;一舉跌破 3160 美元 / 盎司&#xff0c;日內跌幅達 2.56%&#xff1b;紐約期金日內也大跌 2%&#xff0c…

智慧校園(含實驗室)智能化專項匯報方案

該方案聚焦智慧校園(含實驗室)智能化建設,針對傳統實驗室在運營監管、環境監測、安全管控、排課考勤等方面的問題,依據《智慧校園總體框架》等標準,設計數字孿生平臺、實驗室綜合管理平臺、消安電一體化平臺三大核心平臺,涵蓋通信、安防、建筑設備管理等設施,涉及 395 個…

【Python爬蟲 !!!!!!政府招投標數據爬蟲項目--醫療實例項目文檔(提供源碼!!!)!!!學會Python爬蟲輕松賺外快】

政府招投標數據爬蟲項目--醫療實例項目文檔 1. 項目概述1.1 項目目標1.2 技術棧2. 系統架構2.1 模塊劃分2.2 流程示意圖3. 核心模塊設計3.1 反爬處理模塊(`utils/anti_crawler.py`)3.1.1 功能特性3.1.2 關鍵代碼3.2 爬蟲模塊(`crawler/spiders/`)3.2.1 基類設計(`base_spi…

RabbitMQ是什么?應用場景有哪些?

RabbitMQ 是一款開源的消息代理中間件,基于 AMQP(高級消息隊列協議)實現,用于在分布式系統中進行異步通信和消息傳遞。它通過將消息的發送者和接收者解耦,提高了系統的可擴展性、可靠性和靈活性。 核心特點 多協議支持:不僅支持 AMQP,還兼容 STOMP、MQTT 等多種消息協議…

RT Thread FinSH(msh)調度邏輯

文章目錄 概要FinSH功能FinSH調度邏輯細節小結 概要 RT-Thread&#xff08;Real-Time Thread&#xff09;作為一款開源的嵌入式實時操作系統&#xff0c;在嵌入式設備領域得到了廣泛應用。 該系統不僅具備強大的任務調度功能&#xff0c;還集成了 FinSH命令行系統&#xff0c…

我司助力高校打造「智慧創新AI學習中心」

為推動AI教育融合跨領域應用&#xff0c;東吳大學于2025年4月舉行「智慧創新AI學習中心」揭牌儀式&#xff0c;并宣布正式啟動AI特色課程與教學空間建置計畫。此次建置由我司協助整體教室空間與設備規劃&#xff0c;導入最新NVIDIA GeForce RTX 50系列桌上型電腦&#xff0c;并…

給你的matplotlib images添加scale Bar

?Scale Bar&#xff08;比例尺&#xff09;用于直觀表示圖像與實際物理尺寸&#xff08;如微米、毫米等&#xff09;的對應關系。例如&#xff0c;在顯微鏡圖像中&#xff0c;比例尺可以標注“75μm”表示圖中某線段對應的實際長度。 這里分享使用matplotlib中的imshow結合ma…

基于React的高德地圖api教程004:線標記繪制、修改、刪除功能實現

文章目錄 4、線繪制4.1 繪制線標記4.1.1 開啟線標記繪制模式4.1.2 繪制線標記4.1.3 關閉線標記模式4.2 可視化線標記數據面板4.3 修改線標記4.3.1 修改線標記路徑4.3.2 修改線標記名稱和顏色4.4 刪除線標記4.5 定位線標記4.6 代碼下載4.04、線繪制 4.1 繪制線標記 4.1.1 開啟…

lc42接雨水

1.原題 42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖&#xff0c;計算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 2.題目解析 這一題是經常被考到的一道算法題&#xff0c;其中最簡單最好用的方法就是雙指…

【讀代碼】端到端多模態語言模型Ultravox深度解析

一、項目基本介紹 Ultravox是由Fixie AI團隊開發的開源多模態大語言模型,專注于實現音頻-文本的端到端實時交互。項目基于Llama 3、Mistral等開源模型,通過創新的跨模態投影架構,繞過了傳統語音識別(ASR)的中間步驟,可直接將音頻特征映射到語言模型的高維空間。 核心優…

力扣HOT100之二叉樹:98. 驗證二叉搜索樹

這道題之前也刷過&#xff0c;自己做了一遍&#xff0c;發現卡在了第70多個樣例&#xff0c;才發現自己沒有利用二叉搜索樹的性質&#xff0c;但凡涉及到二叉搜索樹&#xff0c;應該首先考慮中序遍歷&#xff01;&#xff01;&#xff01; 被卡住的測試樣例是這樣的&#xff1a…

Centos7.9同步外網yum源至內網

curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum makecache yum repolist安裝軟件 yum install -y yum-utils createrepo # yum-utils包含re…

HMDB51數據集劃分

生成訓練集、驗證集和測試集 每個split文件應該包含&#xff1a; 訓練集(id1): 70個視頻測試集(id2): 30個視頻未使用(id0): 剩余視頻 這是一個70/30的訓練/測試分割比例。標記為0的視頻被排除在當前實驗之外。實際上訓練集&#xff08;id1&#xff09;&#xff0c;驗證集&am…

Spring Boot 項目的計算機專業論文參考文獻

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…