SpringBoot中使用MCP和通义千问来处理和分析数据-连接本地数据库并生成实体类
文章目录
- 前言
- 一、正文
- 1.1 项目结构
- 1.2 项目环境
- 1.3 完整代码
- 1.3.1 spring-mcp-demo的pom文件
- 1.3.2 generate-code-server的pom文件
- 1.3.3 ChatClientConfig
- 1.3.4 FileTemplateConfig
- 1.3.5 ServiceProviderConfig
- 1.3.6 GenerateCodeController
- 1.3.7 Columns
- 1.3.8 Tables
- 1.3.9 FileTemplateEnum
- 1.3.10 InformationSchemaManager
- 1.3.11 ColumnService
- 1.3.12 ColumnServiceImpl
- 1.3.13 GenerateCodeService
- 1.3.14 GenerateCodeServiceImpl
- 1.3.15 TableService
- 1.3.16 TableServiceImpl
- 1.3.17 GenerateCodeServerApplication
- 1.4 完整配置
- 1.4.1 entityTemplate.txt
- 1.4.2 enumTemplate.txt
- 1.4.3 application.yml
- 1.5 页面示例
- 1.5.1 页面展示
- 1.5.2 index.html
- 二、附录
- 2.1 一些可能实现的功能推荐
- 2.2 Srping-AI MCP的官方文档
- 2.3 阿里百炼MCP服务
前言
最近在研究学习 SpringBoot 和 MCP + 通义千问的实际使用。
本篇文章主要是连接数据库,查表信息和字段信息,然后根据这些信息做一些操作,比如生成实体类,枚举等。
项目技术栈和同系列文章【SpringBoot中使用MCP和通义千问来处理和分析数据-入门,查寻和基本的分析】类似。
本篇的主要特点是使用了 webflux 的 starter,在控制器层采取流式输出,并做了一个简单的页面来展示结果。(主要原因是同步的方式会经常超时)
一、正文
1.1 项目结构
整体项目采取两部分,父模块和子模块,父级主要控制依赖版本。子级模块用于功能的实现。
1.2 项目环境
本次实践会真实连接mysql进行一些操作。使用了最简单的jdbc。
另外配置了代码示例,生成代码时会参考示例中的代码。
1.3 完整代码
1.3.1 spring-mcp-demo的pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.mcp</groupId><artifactId>spring-mcp-demo</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><name>spring-mcp-demo</name><modules><module>generate-code-server</module></modules><properties><java.version>21</java.version><spring-boot.version>3.4.2</spring-boot.version><spring-ai.version>1.0.0-M6</spring-ai.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding></properties><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></repository><repository><id>maven2</id><name>maven2</name><url>https://repo1.maven.org/maven2/</url><snapshots><enabled>false</enabled></snapshots></repository><repository><name>Central Portal Snapshots</name><id>central-portal-snapshots</id><url>https://central.sonatype.com/repository/maven-snapshots/</url><releases><enabled>false</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>${spring-ai.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter</artifactId><version>${spring-ai.version}.1</version></dependency></dependencies></dependencyManagement></project>
1.3.2 generate-code-server的pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><groupId>org.mcp</groupId><artifactId>spring-mcp-demo</artifactId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>generate-code-server</artifactId><version>0.0.1-SNAPSHOT</version><name>generate-code-server</name><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.34</version><optional>true</optional></dependency><!-- webflux的starter --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-server-webflux-spring-boot-starter</artifactId></dependency><!-- 阿里ai的starter --><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version><scope>runtime</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><inherited>true</inherited><configuration><source>${java.version}</source><target>${java.version}</target><parameters>true</parameters><showWarnings>true</showWarnings></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>org.mcp.GenerateCodeServerApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>
1.3.3 ChatClientConfig
package org.mcp.config;import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 聊天对话配置*/
@Configuration
public class ChatClientConfig {@Autowiredprivate ToolCallbackProvider toolCallbackProvider;/*** 配置ChatClient,注册系统指令和工具函数*/@Beanpublic ChatClient chatClient(ChatClient.Builder builder) {InMemoryChatMemory inMemoryChatMemory = new InMemoryChatMemory();return builder.defaultSystem("你是一个代码生成助手,可以根据读取配置信息,以及关键词、字段名等生成同样格式的Java代码。" +"你可以根据用户给的提示词,来指定对应的类名,文档注释等信息。注意,所有类或枚举都需要文档注释,所有public或比较关键的方法也都需要文档注释,特殊算法的代码上需要行注释。"+"生成枚举时,根据用户给的提示信息,使用英文单词作为枚举变量名,并按指定的枚举代码示例来生成类似的枚举类。" +"在生成代码时,你可以查数据库的表信息,包括并不限于表字段,备注,字段类型等。" +"生成代码时使用java1.8版本。并且生成实体的日期类型数据,采用java.util.Date类。" +"回复时,请使用简洁友好的语言。代码中不需要转义符,需要能直接粘贴来用的格式。")// 注册工具方法.defaultTools(toolCallbackProvider)// 支持多轮对话.defaultAdvisors(new MessageChatMemoryAdvisor(inMemoryChatMemory)).build();}
}
1.3.4 FileTemplateConfig
package org.mcp.config;import jakarta.annotation.PostConstruct;
import org.mcp.enums.FileTemplateEnum;
import org.springframework.context.annotation.Configuration;import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;/*** 文件模版配置** @author mcp* @version 1.0* @since 2025-05-07 10:34*/
@Configuration
public class FileTemplateConfig {private static final Map<FileTemplateEnum, String> TEMPLATE_CONTENT_MAP = new HashMap<>();@PostConstructprivate void init() throws IOException {ClassLoader classLoader = FileTemplateConfig.class.getClassLoader();for (FileTemplateEnum fileTemplateEnum : FileTemplateEnum.values()) {InputStream resourceAsStream = classLoader.getResourceAsStream("code-templates/" + fileTemplateEnum.getTemplateName());assert resourceAsStream != null;String content = new String(resourceAsStream.readAllBytes());TEMPLATE_CONTENT_MAP.put(fileTemplateEnum, content);}}public static String getTemplateContent(FileTemplateEnum fileTemplateEnum) {return TEMPLATE_CONTENT_MAP.get(fileTemplateEnum);}
}
1.3.5 ServiceProviderConfig
package org.mcp.config;import org.mcp.service.ColumnService;
import org.mcp.service.GenerateCodeService;
import org.mcp.service.TableService;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 服务提供者配置*/
@Configuration
public class ServiceProviderConfig {@Autowiredprivate GenerateCodeService generateCodeService;@Autowiredprivate TableService tableService;@Autowiredprivate ColumnService columnService;@Beanpublic ToolCallbackProvider serverTools() {return MethodToolCallbackProvider.builder()// 可以注册多个服务.toolObjects(generateCodeService, tableService, columnService).build();}
}
1.3.6 GenerateCodeController
package org.mcp.controller;import jakarta.annotation.Resource;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import reactor.core.publisher.Flux;/*** 代码生成控制器** @author mcp* @version 1.0* @since 2025-05-07 10:21*/
@Controller
@Slf4j
@RequestMapping("/api/chat")
public class GenerateCodeController {@Resourceprivate ChatClient chatClient;@GetMapping(value = "/generateCode", produces = MediaType.TEXT_EVENT_STREAM_VALUE)@SneakyThrowspublic Flux<String> generateCode(@RequestParam("conversationId") String conversationId, @RequestParam("message") String message) {log.info("GenerateCodeController.generateCode(), conversationId:{},message:{}", conversationId, message);return chatClient.prompt().advisors(spec -> spec.param(AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY, conversationId).param(AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY, 50)).user(message).stream().content();}
}
1.3.7 Columns
package org.mcp.entity;import lombok.Data;/*** 列信息** @author mcp* @version 1.0* @since 2025-05-07 14:07*/
@Data
public class Columns {/*** 列名*/private String columnName;/*** 数据类型*/private String dataType;/*** 列备注*/private String columnComment;
}
1.3.8 Tables
package org.mcp.entity;import lombok.Data;/*** 表信息** @author mcp* @version 1.0* @since 2025-05-07 13:54*/
@Data
public class Tables {/*** 表名*/private String tableName;/*** 表注释*/private String tableComment;
}
1.3.9 FileTemplateEnum
package org.mcp.enums;import lombok.AllArgsConstructor;
import lombok.Getter;/*** 文件模版名枚举** @author mcp* @version 1.0* @since 2025-05-07 10:41*/
@Getter
@AllArgsConstructor
public enum FileTemplateEnum {ENTITY_TEMPLATE("entityTemplate.txt"),ENUM_TEMPLATE("enumTemplate.txt");private final String templateName;
}
1.3.10 InformationSchemaManager
package org.mcp.manager;import jakarta.annotation.Resource;
import org.mcp.entity.Columns;
import org.mcp.entity.Tables;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;import java.util.List;
import java.util.Map;/*** 数据库信息结构管理器** @author mcp* @version 1.0* @since 2025-05-07 11:27*/
@Component
public class InformationSchemaManager {@Resourceprivate JdbcTemplate jdbcTemplate;/*** 查找所有可用的的表名*/public List<Tables> findAllTableNames(String tableSchema) {String sql = "SELECT TABLE_NAME,TABLE_COMMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = ?";return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Tables.class), tableSchema);}/*** 查找所有可用的列名*/public List<Columns> findAllColumns(String tableSchema, String tableName) {String sql = "SELECT COLUMN_NAME,DATA_TYPE,COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?";return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Columns.class), tableSchema, tableName);}}
1.3.11 ColumnService
package org.mcp.service;import org.mcp.entity.Columns;import java.util.List;/*** 列服务** @author mcp* @version 1.0* @since 2025-05-07 14:11*/
public interface ColumnService {List<Columns> findAllColumns(String tableSchema, String tableName);
}
1.3.12 ColumnServiceImpl
package org.mcp.service.impl;import jakarta.annotation.Resource;
import org.mcp.entity.Columns;
import org.mcp.manager.InformationSchemaManager;
import org.mcp.service.ColumnService;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.stereotype.Service;import java.util.List;/*** 列服务实现** @author 01434188* @version 1.0* @since 2025-05-07 14:11*/
@Service
public class ColumnServiceImpl implements ColumnService {@Resourceprivate InformationSchemaManager informationSchemaManager;@Override@Tool(name = "findAllColumns", description = "根据schema和表名,查询当前数据库下的对应数据库表字段信息,包含字段名,字段类型,字段备注。")public List<Columns> findAllColumns(@ToolParam(description = "表的schema,即数据库名") String tableSchema, @ToolParam(description = "表名") String tableName) {return informationSchemaManager.findAllColumns(tableSchema, tableName);}
}
1.3.13 GenerateCodeService
package org.mcp.service;/*** 代码生成服务** @author mcp* @version 1.0* @since 2025-05-07 10:18*/
public interface GenerateCodeService {/*** 获取枚举代码模板*/String getEnumCodeTemplate();/*** 获取实体代码模板*/String getEntityCodeTemplate();
}
1.3.14 GenerateCodeServiceImpl
package org.mcp.service.impl;import org.mcp.config.FileTemplateConfig;
import org.mcp.enums.FileTemplateEnum;
import org.mcp.service.GenerateCodeService;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.stereotype.Service;/*** 代码生成服务实现** @author mcp* @version 1.0* @since 2025-05-07 10:19*/
@Service
public class GenerateCodeServiceImpl implements GenerateCodeService {@Override@Tool(name = "getEnumCodeTemplate", description = "根据枚举名和描述、给定的java枚举类示例,生成java枚举类的代码了;例如枚举描述的格式是:单据状态:1=正常,2=已关闭,3=已作废,4=已冻结")public String getEnumCodeTemplate() {// 获取模版内容return FileTemplateConfig.getTemplateContent(FileTemplateEnum.ENUM_TEMPLATE);}@Override@Tool(name = "getEntityCodeTemplate", description = "根据实体名和描述、给定的java实体类示例,生成java实体类的代码,特别注意,实体如果有创建人,创建人ID,创建时间,修改人,修改人ID,修改时间,则需要继承EntityBase类。"+ "如果存在枚举属性,则同时需要根据描述生成对应的枚举")public String getEntityCodeTemplate() {// 获取模版内容return FileTemplateConfig.getTemplateContent(FileTemplateEnum.ENTITY_TEMPLATE);}
}
1.3.15 TableService
package org.mcp.service;import org.mcp.entity.Tables;import java.util.List;/*** 表服务** @author mcp* @version 1.0* @since 2025-05-07 14:01*/
public interface TableService {List<Tables> findAllTableNames(String tableSchema);
}
1.3.16 TableServiceImpl
package org.mcp.service.impl;import jakarta.annotation.Resource;
import org.mcp.entity.Tables;
import org.mcp.manager.InformationSchemaManager;
import org.mcp.service.TableService;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.stereotype.Service;import java.util.List;/*** 表服务实现** @author mcp* @version 1.0* @since 2025-05-07 14:01*/
@Service
public class TableServiceImpl implements TableService {@Resourceprivate InformationSchemaManager informationSchemaManager;@Override@Tool(name = "findAllTableNames", description = "根据schema或数据库名,查询当前数据库下的所有可用的表名和表备注")public List<Tables> findAllTableNames(@ToolParam(description = "表的schema,即数据库名") String tableSchema) {return informationSchemaManager.findAllTableNames(tableSchema);}
}
1.3.17 GenerateCodeServerApplication
package org.mcp;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.CrossOrigin;@SpringBootApplication
@CrossOrigin(origins = "*",allowedHeaders = "*",exposedHeaders = {"Cache-Control", "Connection"} // 暴露必要头
)
public class GenerateCodeServerApplication {public static void main(String[] args) {SpringApplication.run(GenerateCodeServerApplication.class, args);}
}
1.4 完整配置
1.4.1 entityTemplate.txt
package org.pine.entity;import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.pine.api.enums.DeliveryStatusEnum;
import org.pine.api.enums.OrderStatusEnum;import java.util.Date;/*** 出库单** @author 01434188* @version 1.0* @since 2025-04-29 10:46*/
@EqualsAndHashCode(callSuper = true)
@Data
@Accessors(chain = true)
public class OutboundOrder extends EntityBase {/*** 主键id*/private Long id;/*** 出库单号*/private String outboundNo;/*** 出库通知单号*/private String outboundNoticeNo;/*** 出库通知明细流水号*/private String outboundNoticeDetailNo;/*** 出库作业号*/private String outboundTaskNo;/*** 出库作业明细号*/private String outboundTaskDetailNo;/*** 出库状态:1=未出库,3=全部出库*/private DeliveryStatusEnum deliveryStatus;/*** 单据状态:1=正常,2=已关闭,3=已作废,4=已冻结*/private OrderStatusEnum status;/*** 出库日期*/private Date outboundDate;/*** 物料名称*/private String materialName;/*** 物料代码*/private String materialCode;
}
1.4.2 enumTemplate.txt
package org.pine.api.enums;import lombok.AllArgsConstructor;
import lombok.Getter;import java.util.Arrays;
import java.util.Objects;/*** 单据状态枚举** @author mcp* @version 1.0* @since 2025-04-29 11:18*/
@AllArgsConstructor
@Getter
public enum OrderStatusEnum {// 单据状态:1=正常,2=已关闭,3=已作废,4=已冻结NORMAL(1, "正常"),CLOSED(2, "已关闭"),INVALID(3, "已作废"),FROZEN(4, "已冻结");private final Integer code;private final String message;public static OrderStatusEnum getInstance(Integer code) {if (Objects.isNull(code)) {return null;}return Arrays.stream(OrderStatusEnum.values()).filter(e -> Objects.equals(e.getCode(), code)).findFirst().orElse(null);}
}
1.4.3 application.yml
server:port: 8081tomcat:uri-encoding: UTF-8keep-alive-timeout: 30000max-connections: 100servlet:encoding:charset: UTF-8force: trueenabled: truecompression:enabled: false # 禁用压缩(否则流式数据可能被缓冲)spring:main:allow-bean-definition-overriding: trueapplication:name: mcp-serverdatasource:url: jdbc:mysql://localhost:3306/test1?useSSL=false&serverTimezone=UTCusername: eqqpassword: 111driver-class-name: com.mysql.cj.jdbc.Driverai:mcp:server:stdio: falseenabled: truename: mcp-server # MCP服务器名称type: ASYNCversion: 1.0.0 # 服务器版本号# 配置阿里的密钥,模型dashscope:api-key: sk-ba8xxx你自己的keychat:options:model: qwen-plus
1.5 页面示例
1.5.1 页面展示
启动springboot项目后,访问地址:http://localhost:8081/
第一个输入框中输入你的想法,例如,查看一下数据库表xxx.xxx的信息,并生成java实体类代码,涉及到枚举的话,也生成一下
。第二个输入框是对话ID,同一个对话ID可以进行多轮对话。
得到的结果如下(页面没渲染markdown,也没做代码高亮):
1.5.2 index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>流式 Markdown 展示</title><style>#output {border: 1px solid #ccc;padding: 15px;margin-top: 10px;min-height: 200px;white-space: pre-wrap;}</style>
</head><body>
<input type="text" id="promptInput" placeholder="输入提示..." style="width: 80%; padding: 10px;">
<input type="text" id="conversationIdInput" placeholder="输入conversationId..." style="width: 80%; padding: 10px;">
<button onclick="sendPrompt()">发送</button>
<button onclick="disconnectAiServer()">断开连接</button>
<h2>流式 Markdown 输出:</h2>
<div id="output"></div><div style="height: 100px"> </div>
<script>let eventSource;function connectAiServer(url) {eventSource = new EventSource(url);}function disconnectAiServer() {if (eventSource) {eventSource.close()}autoCloseAlert("已经断开sse连接!", 1500);}const outputDiv = document.getElementById('output');function sendPrompt() {outputDiv.textContent = '';const prompt = document.getElementById('promptInput').value;const conversationId = document.getElementById('conversationIdInput').value;try {connectAiServer(`http://localhost:8081/api/chat/generateCode?conversationId=${encodeURIComponent(conversationId)}&message=${encodeURIComponent(prompt)}`);autoCloseAlert("已经建立sse连接!", 1500);eventSource.onmessage = function(event) {try {const content = event.data || '';outputDiv.textContent += (content);} catch (e) {console.error('解析失败:', e);disconnectAiServer();}};} catch (e) {outputDiv.textContent = '请求失败' + e.message;disconnectAiServer();}eventSource.onerror = function(err) {console.error("SSE 错误:", err);disconnectAiServer();};}function autoCloseAlert(message, duration = 2000) {const alertBox = document.createElement('div');alertBox.style.position = 'fixed';alertBox.style.top = '20px';alertBox.style.left = '50%';alertBox.style.transform = 'translateX(-50%)';alertBox.style.backgroundColor = '#ff4d4d';alertBox.style.color = '#fff';alertBox.style.padding = '10px 20px';alertBox.style.borderRadius = '5px';alertBox.style.zIndex = '9999';alertBox.innerText = message;document.body.appendChild(alertBox);setTimeout(() => {alertBox.remove();}, duration);}</script>
</body>
</html>
二、附录
2.1 一些可能实现的功能推荐
以下内容来自kimi。
Spring Boot + MCP 可实现的应用方向及示例:智能对话系统
应用场景:打造一个能与用户进行智能对话的系统,如客服机器人、聊天助手等,可集成到网页、移动应用等多渠道,为用户提供更便捷的服务。
实现要点:利用 Spring Boot 搭建基础服务架构,引入 MCP 相关依赖,例如 spring-ai-core、spring-ai-anthropic-spring-boot-starter 等,通过在服务方法上添加 @Tool 注解等配置,将业务逻辑与 AI 对话功能集成,实现对用户输入的智能理解和自动回复。智能代码助手
应用场景:为开发者提供代码编写建议、代码片段、技术文档等辅助信息,提高开发效率和代码质量。
实现要点:结合 Spring Boot 构建服务,借助 MCP 的能力,利用现有的代码库、技术文档等资源训练 AI 模型,使其理解代码逻辑和开发场景,为用户提供服务。私密知识库问答
应用场景:为个人或团队建立专属的知识库,用户可通过自然语言提问获取知识库中的信息,满足企业内部知识管理、个人学习笔记整理等需求。
实现要点:使用 Spring Boot + MCP 构建应用,将知识库的内容进行数据化处理,并利用 AI 模型进行语义理解和知识检索,实现精准的知识问答。智能数据分析助手
应用场景:帮助用户分析数据,如销售数据、财务数据、市场调研数据等,提供数据可视化、趋势预测等功能。
实现要点:在 Spring Boot 服务中集成数据分析库和工具,如 Apache POI 等,再通过 MCP 将其与 AI 功能整合,使用户能以对话的形式进行数据分析操作。智能内容创作助手
应用场景:辅助用户创作文本内容,如撰写文章、生成文案、创作故事等,为内容创作者提供灵感和便利。
实现要点:利用 Spring Boot 搭建平台,结合 MCP 调用 AI 文本生成模型,根据用户输入的主题、关键词等要求生成相应的内容。智能教育辅导
应用场景:针对教育领域,为学生提供个性化学习辅导、问题解答、作业批改等功能。
实现要点:收集整合教育资源,如教材、题库、知识点讲解等,构建教育知识图谱,通过 Spring Boot + MCP 为学生提供智能辅导服务。智能健康助手
应用场景:为用户提供必须的健康咨询、症状分析、健康建议等服务。
实现要点:整合医疗健康知识库和用户健康数据,利用 AI 模型进行症状分析和健康风险评估,通过 Spring Boot 构建应用并用 MCP 实现智能对话功能。智能旅行规划助手
应用场景:帮助用户规划旅行行程,包括目的地推荐、景点介绍、行程安排、酒店预订等。
实现要点:收集旅游数据,如景点信息、交通时刻表、酒店资源等,结合用户的偏好和需求,通过 Spring Boot + MCP 提供个性化的旅行规划建议。智能音乐推荐助手
应用场景:根据用户的音乐喜好和听歌历史,为其推荐符合口味的音乐、歌单等。
实现要点:分析用户的音乐数据,建立音乐推荐模型,利用 Spring Boot + MCP 为用户提供准确的音乐推荐服务。智能汽车助手
应用场景:为汽车用户提供一个智能助手,实现车辆信息查询、远程控制、驾驶辅助等功能,提升车主的驾驶体验。
实现要点:借助汽车的物联网技术获取车辆数据,通过 Spring Boot + MCP 构建智能助手应用,实现与车主的智能交互。
2.2 Srping-AI MCP的官方文档
https://docs.spring.io/spring-ai/reference/1.0/api/mcp/mcp-overview.html
2.3 阿里百炼MCP服务
mcp介绍:
https://help.aliyun.com/zh/model-studio/mcp-introduction
mcp服务:
https://bailian.console.aliyun.com/?spm=a2c4g.11186623.0.0.60907980b9Eirh&tab=mcp#/mcp-market
百炼说明文档:
https://help.aliyun.com/zh/model-studio/what-is-model-studio?spm=a2c4g.11174283.0.i0
相关文章:
SpringBoot中使用MCP和通义千问来处理和分析数据-连接本地数据库并生成实体类
文章目录 前言一、正文1.1 项目结构1.2 项目环境1.3 完整代码1.3.1 spring-mcp-demo的pom文件1.3.2 generate-code-server的pom文件1.3.3 ChatClientConfig1.3.4 FileTemplateConfig1.3.5 ServiceProviderConfig1.3.6 GenerateCodeController1.3.7 Columns1.3.8 Tables1.3.9 Fi…...
算法每日一题 | 入门-分支结构-Apples Prologue/苹果和虫子
Apples Prologue/苹果和虫子 题目描述 小 B 喜欢吃苹果。她现在有 m m m(1 ≤ m ≤100)个苹果,吃完一个苹果需要花费 t t t(0 ≤ t≤ 100)分钟,吃完一个后立刻开始吃下一个。 现在时间过去了 s s s&a…...
浙大与哈佛联合开源图像编辑模型IC-Edit,实现高效、精准、快速的指令编辑~
项目背景 研究动机与目标 ICEdit(In-Context Edit)由浙江大学团队开发,旨在通过自然语言指令实现高效、精准的图像编辑,降低对大规模训练数据和计算资源的需求。传统图像编辑方法(如基于微调的扩散模型或无训练技术&…...
查看jdk是否安装并且配置成功?(Android studio安装前的准备)
WinR输入cmd打开命令提示窗口 输入命令 java -version 回车显示如下:...
Off-Policy策略演员评论家算法SAC详解:python从零实现
引言 软演员评论家(SAC)是一种最先进的Off-Policy策略演员评论家算法,专为连续动作空间设计。它在 DDPG、TD3 的基础上进行了显著改进,并引入了最大熵强化学习的原则。其目标是学习一种策略,不仅最大化预期累积奖励&a…...
基于大模型的计划性剖宫产全流程预测与方案优化研究报告
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型在计划性剖宫产中的应用原理 2.1 大模型介绍 2.2 数据收集与处理 2.3 模型训练与优化 三、术前预测与准备 3.1 风险因素评估 3.2 大模型术前预测 3.3 术前准备方案 四、术中预测与应对 4.1 术中…...
在Lua中使用轻量级userdata在C/C++之间传递数据和调用函数
在Lua中使用轻量级userdata在C/C之间传递数据和调用函数 轻量级userdata是Lua中一种高效的数据传递机制,它允许你在C/C和Lua之间传递指针而不创建完整的userdata对象。下面是如何使用轻量级userdata的详细说明: 基本概念 轻量级userdata:只…...
总线通信篇:I2C、SPI、CAN 的底层结构与多机通信设计
本文为嵌入式通信协议系列第三章,深入剖析 MCU 世界中的三大总线协议 —— I2C、SPI 和 CAN。 这些总线协议广泛应用于传感器数据采集、Flash 存储、外设扩展、汽车电子、工业设备控制等领域,是嵌入式开发不可或缺的通信骨架。 📜 一、总线通信的基本概念 1.1 什么是总线?…...
心跳策略(Heartbeat) 和 Ping/Echo 策略
一、心跳策略(Heartbeat) 原理:客户端定期向服务端发送心跳包,服务端监控客户端存活状态,超时未收到心跳则判定客户端离线 服务端代码 using System; using System.Net; using System.Net.Sockets; using System.Coll…...
探索网络设备安全:Shodan 的原理与合法应用
在数字化时代,网络摄像头因其便捷性和高效性被广泛应用于家庭、商业和工业领域。然而,这些设备的安全性问题也日益受到关注。Shodan,这个被称为“设备搜索引擎”的工具,能够帮助我们发现和分析网络摄像头的分布和安全性。本文将深…...
Java JWT 配置类 (JwtProperties) 学习笔记
1. 核心作用: 此类 (JwtProperties) 作为一个集中的“配置信息持有者”,专门用来存储项目中与 JWT(JSON Web Token,一种用于身份验证的令牌)相关的配置参数。 2. 关键注解说明: Component: 含义ÿ…...
沃伦森电容器支路阻抗特性监控系统 电容器组智能健康管理专家
行业现状与挑战 在现代电力系统中,电容器组作为无功补偿的核心设备,对保障电网稳定运行和提升电能质量至关重要。然而,长期运行中面临的谐波干扰、过电压/过电流冲击等问题,极易导致电容值衰减、介质老化甚至爆炸等严重故障&#…...
macOS Arduino IDE离线安装ESP8266支持包
其实吧,本来用platformio也是可以的,不过有时候用Arduino IDE可能更快一些,因为以前一直是Arduino.app和Arduino IDE.app共存了一段时间,后来下决心删掉Arduino.app并升级到最新的Arduino IDE.app。删除了旧的支持板级支持包之后就…...
在Fiddler中添加自定义HTTP方法列并高亮显示
在Fiddler中添加自定义HTTP方法列并高亮显示 Fiddler 是一款强大的 Web 调试代理工具,允许开发者检查和操作 HTTP 流量。一个常见需求是自定义 Web Sessions 列表,添加显示 HTTP 方法(GET、POST 等)的列,并通过颜色区…...
HTTP学习
HTTP知识 01. 经典五层模型 应用层 为应用软件提供了很多服务,构建于协议之上。 传输层 数据的传输都是在这层定义的,数据过大分包,分片。 网络层 为数据在节点之间传输创建逻辑链路 数据链路层 通讯实体间建立数据链路连接 物理层 主要作用…...
正态分布和幂律分布
1. 背景与引入 正态分布 历史来源:18世纪由高斯(Gauss)在研究测量误差时提出,后被广泛应用于自然现象和社会科学的数据建模。重要性:被称为“钟形曲线”,是统计学中最核心的分布之一,支撑中心极…...
网络安全赛题解析
扫描之后发现目标靶机 上开启了 ftp ssh http mysql等服务 第一题 第一题需要获取文件 首先尝试 ftp 匿名用户 从这里可以发现 hint.txt 文件的大小为 127b 或 127bytes 提交127b 第二题 通过hint.txt 文件可以发现目标主机 上有用户 Jay 密码为五位字符串 其中三位不知道 利…...
Android单例模式知识总结
六种核心实现方式对比 1. 饿汉式单例(Eager Initialization) 原理:利用类加载时静态变量初始化的特性,天然线程安全。 代码: public class EagerSingleton {private static final EagerSingleton INSTANCE new Eag…...
何不乘东风?利用mcp实现小红书自动发布
1.准备环境 conda create -n mcpo python3.11 conda activate mcpo pip install mcpo pip install uvnpx puppeteer/browsers install chromedriver134.0.6998.166pip install xhs-mcp-server 2.进行登陆 env phoneYOUR_PHONE_NUMBER json_pathPATH_TO_STORE_YOUR_COOKIES u…...
DeepSeek多尺度数据:无监督与原则性诊断方案全解析
DeepSeek 多尺度数据诊断方案的重要性 在当今的 IT 领域,数据如同石油,是驱动各类智能应用发展的核心资源。随着技术的飞速发展,数据的规模和复杂性呈爆炸式增长,多尺度数据处理成为了众多领域面临的关键挑战。以计算机视觉为例,在目标检测任务中,小目标可能只有几个像素…...
【开源】Python打造高效剪贴板历史管理器:实现跨平台生产力工具
📋【开源】Python打造高效剪贴板历史管理器:实现跨平台生产力工具 🌈 个人主页:创客白泽 - CSDN博客 🔥 系列专栏:🐍《Python开源项目实战》 💡 热爱不止于代码,热情源自…...
Day 14 训练
Day 14 训练 SHAP(SHapley Additive exPlanations)1.创建解释器2.将特征贡献可视化第一部分:绘制SHAP特征重要性条形图第二部分:绘制SHAP特征重要性蜂巢图 SHAP(SHapley Additive exPlanations) 旨在解释复…...
V型球阀材质性能深度解析:专攻颗粒、料浆与高腐蚀介质的工业利器-耀圣
V型球阀材质性能深度解析:专攻颗粒、料浆与高腐蚀介质的工业利器 在工业流体控制领域,V型球阀凭借其独特的V型切口设计与多元化材质适配能力,成为含颗粒、纤维、料浆及强腐蚀性介质的“终极克星”。本文从材质性能与驱动适配性两大维度切入&…...
缓存套餐-01.Spring Cache入门案例
一.导入案例代码 application.yml server:port: 8888 spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/spring_cache_demo?serverTimezoneAsia/Shanghai&useUnicodetrue&characterEncodingutf-8&zeroDat…...
2025年APP安全攻防指南:抵御DDoS与CC攻击的实战策略
2025年,随着AI技术与物联网设备的深度渗透,DDoS与CC攻击的复杂性和破坏性显著升级。攻击者通过伪造用户行为、劫持智能设备、利用协议漏洞等手段,对APP发起精准打击,导致服务瘫痪、用户流失甚至数据泄露。面对这一挑战,…...
力扣:多数元素
题目 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 示例 1: 输入:nums [3,2,3] 输出ÿ…...
2025年小程序DDoS与CC攻击防御全指南:构建智能安全生态
2025年,小程序已成为企业数字化转型的核心载体,但随之而来的DDoS与CC攻击也愈发复杂化、智能化。攻击者利用AI伪造用户行为、劫持物联网设备发起T级流量冲击,甚至通过漏洞窃取敏感数据。如何在高并发业务场景下保障小程序的稳定与安全&#x…...
【Python】PDF文件处理(PyPDF2、borb、fitz)
Python提供了多种方法和库用于处理PDF文件,这些工具可以帮助开发者实现诸如读取、写入、合并、拆分以及压缩等功能。以下是几个常用的Python PDF操作库及其基本用法(PyPDF2、borb、fitz)。 1. PyPDF2 PyPDF2 是一个功能强大的库࿰…...
Web 架构之前后端分离
文章目录 思维导图一、引言二、前后端分离的概念代码示例(简单的前后端分离交互)后端(使用 Python Flask 框架)前端(使用 JavaScript 和 jQuery) 三、前后端分离的优势3.1 提高开发效率3.2 代码可维护性增强…...
Pycharm安装后打开提示:此应用无法在你的电脑上运行,若要找到合适于你的电脑的版本,请咨询发布者
问题描述 今天下载安装好社区版的pycharm之后双击运行出现提示:此应用无法在你的电脑上运行,若要找到合适于你的电脑的版本,请咨询发布者。 首先我们需要查看Windows如何查看系统是ARM64还是X64架构 在 cmd 命令窗中输入 systeminfo 即可&a…...
正则表达式实战指南:原理、口诀与高频场景案例
正则表达式实战指南:原理、口诀与高频场景案例 正则表达式(Regular Expression)是程序员处理文本的瑞士军刀,被广泛应用于数据验证、日志分析、爬虫开发等领域。本文将从原理讲解、口诀速查到高频实战案例,带你系统掌…...
Spark缓存--persist方法
1. 功能本质 persist:这是一个通用的持久化方法,能够指定多种不同的存储级别。存储级别决定了数据的存储位置(如内存、磁盘)以及存储形式(如是否序列化)。 2. 存储级别指定 persist:可以通过传入…...
【LeetCode 热题 100】二叉树 系列
📁 104. 二叉树的最大深度 深度就是树的高度,即只要左右子树其中有一个不为空,就继续往下递归,知道节点为空,向上返回。 int maxDepth(TreeNode* root) {if(root nullptr)return 0;return max(maxDepth(root->lef…...
CTF之常见的文件头和文件尾
1、图片 JPEG 文件头:FF D8 FF 文件尾:FF D9TGA 未压缩的前4字节 00 00 02 00 RLE压缩的前5字节 00 00 10 00 00PNG 文件头:89 50 4E 47 0D 0A 1A 0A 文件尾:AE 42 60 82GIF 文件头:47 49 46 38 39(37) 61 文件尾&…...
软件设计师教程——第一章 计算机系统知识(上)
前言 在竞争激烈的就业市场中,证书是大学生求职的重要加分项。中级软件设计师证书专业性强、认可度高,是计算机相关专业学生考证的热门选择,既能检验专业知识,又有助于职业发展。本教程将聚焦核心重点,以点带面构建知…...
KRaft (Kafka 4.0) 集群配置指南(超简单,脱离 ZooKeeper 集群)还包含了简化测试指令的脚本!!!
docker-compose方式部署kafka集群 Kafka 4.0 引入了 KRaft 模式(Kafka Raft Metadata Mode),它使 Kafka 集群不再依赖 ZooKeeper 进行元数据管理。KRaft 模式简化了 Kafka 部署和管理,不需要额外配置 ZooKeeper 服务,…...
安全月演讲比赛活动讲话稿
同志们:在公司上下万众一心创建“无违章企业”的大形势下,由公司工会、团委举办的“安全与我”演讲比赛,经过紧张激烈的预赛,今天进行正式决赛。 从预赛的38名选手中脱颖而出的10名选手,今天将再次登台献技,…...
实时操作系统:航空电子系统的安全基石还是创新枷锁?
引言:航空电子系统的进化论 在航空电子技术的漫长发展历程中,飞行器控制系统实现从机械仪表到数字计算机的跨越,这一进步具有深远意义。现代战机以超过 2 马赫的速度突破音障,无人机群在复杂电磁环境下完成自主编队,这…...
windows 部署 Kafka3.x KRaft 模式 不依赖 ZooKeeper
1.下载 https://archive.apache.org/dist/kafka/3.9.0/kafka_2.12-3.9.0.tgz2.配置使用 KRaft 模式 2.1 修改 Kafka 的配置文件 cd D:\data\bigdata\kafka_2.12-3.9.0\config\kraft 修改 server.properties # 设置 Kafka 数据日志存储目录 log.dirsD:\\data\\bigdata\\kaf…...
SEMI E40-0200 STANDARD FOR PROCESSING MANAGEMENT(加工管理标准)-(一)
1 目的 物料(例如晶圆)加工在设备中的自动化管理与控制是实现工厂自动化的关键要素。本标准针对半导体制造环境中与设备内部物料处理相关的通信需求进行了规范。本标准规定了在加工单元接收到的指定材料所应适用的加工方法(例如Etch腔室需要Run哪支Recipe)。它阐述了物料加工的…...
Web 架构之高可用基础
文章目录 引言一、无状态服务设计(Session 托管至 Redis 集群)1. 概念与原理2. 代码示例(Python Flask 应用)3. 常见问题及解决办法 二、数据库读写分离(MySQL 主从 ProxySQL 流量分发)1. 概念与原理2. 配…...
巧用python之--模仿PLC(PLC模拟器)
工作中用到了VM(VisionMaster4.3)有时候需要和PLC打交道,但是PLC毕竟是别人的,不方便修改别人的程序,这时候需要一个灵活的PLC模拟器是多么好呀! 先说背景: PLC型号 汇川Easy521: Modbus TCP 192.168.1.10:502 在汇川Easy521中Modbus保持寄存器D寄存器 ,在modbus协议中 0-4区…...
Nginx +Nginx-http-flv-module 推流拉流
这两天为了利用云服务器实现 Nginx 进行OBS Rtmp推流,Flv拉流时发生了诸多情况,记录实现过程。 环境 OS:阿里云CentOS 7.9 64位Nginx:nginx-1.28.0Nginx-http-flv-module:nginx-http-flv-module-1.2.12 安装Nginx编…...
DRF+Vue项目线上部署:腾讯云+Centos7.6
1.服务器选购和配置 1.1.服务器选购 1.2.防火墙/安全组配置 80是HTTP的端口,443是HTTPS的端口,22是远程连接的端口,3306是mysql的端口。 1.3.远程连接软件(tabby)配置 下载:https://github.com/Eugeny/ta…...
大疆无人机(全系列,包括mini)拉流至电脑,实现直播
参考视频 【保姆级教程】大疆无人机rtmp推流直播教程_哔哩哔哩_bilibili VLC使用教程: VLC工具使用指南-CSDN博客 目录 实现效果: 电脑端 编辑 编辑 无人机端 VLC拉流 分析 实现效果: (实验机型:大疆mini4kRC-N2遥控器、大…...
Spring普通配置类 vs 自动配置类-笔记
1.简要版 Configuration和Bean,既可以用于普通配置类,也可以用于自动配置类。二者的区别和联系是什么呢? 区别: Configuration和Bean是Spring框架本身的注解,用于定义配置类和生成Bean。而自动配置通常是Spring Boo…...
解决Ceph 14.2.22 Nautilus版本监视器慢操作问题的实践指南
解决Ceph Nautilus版本监视器慢操作问题的实践指南 问题背景问题现象问题分析1. 确认监视器状态2. 检查慢操作详情3. 深入分析操作状态 问题原因解决方案立即解决方法 总结 在生产环境中执行任何操作前,请确保已备份重要数据,并在测试环境中验证解决方案…...
Go使用Gin写一个对MySQL的增删改查服务
首先用SQL创建一个包含id、name属性的users表 create table users (id int auto_incrementprimary key,name varchar(255) null );查询所有用户信息: func queryData(db *sql.DB, w http.ResponseWriter) {rows, err : db.Query("SELECT * FROM users"…...
数字孪生医疗:构建患者特异性数字孪生体路径探析
引言 数字孪生技术正逐渐成为医疗健康领域的一场革命性力量,它通过创建人体器官和系统的数字复制品,为疾病预测、诊断和个性化治疗开辟了前所未有的可能性。在心血管疾病领域,数字孪生技术的应用尤为引人注目,特别是对于扩张型心肌病(Dilated Cardiomyopathy,DCM)这一常…...
rust程序静态编译的两种方法总结
1. 概述 经过我的探索,总结了两种rust程序静态编译的方法,理论上两种方法都适用于windows、mac os和linux(mac os未验证),实测方法一性能比方法二好,现总结如下,希望能够帮到你. 2.方法一 2.1 添加配置文件 在项目的同级文件夹下新…...