当前位置: 首页 > news >正文

Spring-Ai-McpSever从外到内

MCP是什么

Model Context Protocol (MCP) 是一个开放协议,它使 LLM 应用与外部数据源和工具之间的无缝集成成为可能。无论你是构建 AI 驱动的 IDE、改善 chat 交互,还是构建自定义的 AI 工作流,MCP 提供了一种标准化的方式,将 LLM 与它们所需的上下文连接起来
目前,MCP 已经积累了足够的临界规模和动能,因此它被视为 2023-2025 年“代理开放标准”之争的潜在赢家。有人预计,按照当前的速度,MCP 将在 7 月超OpenAPI

JAVA实现MCP

找了一个github的事例代码仅供参考
事例代码:
spring-ai-mcp-deepseek
代码模块比较清晰
在这里插入图片描述

mcp-server

基于springBoot启动配置
application.properties

# MCP服务端开启
spring.ai.mcp.server.enabled=true# MCP服务端配置
spring.ai.mcp.server.name=book-management-server
spring.ai.mcp.server.version=1.0.0
spring.ai.mcp.server.type=SYNC
spring.ai.mcp.server.sse-message-endpoint=/mcp/message
@Configuration
public class McpServerConfig {/*** 注册工具回调提供者,将BookQueryService中的@Tool方法暴露为MCP工具** @param bookService 图书服务* @return 工具回调提供者*/@Beanpublic ToolCallbackProvider bookToolCallbackProvider(BookService bookService) {return MethodToolCallbackProvider.builder().toolObjects(bookService).build();}}

打开 ToolCallbackProvider

public interface ToolCallbackProvider {//回调函数接口需要实现类去实现的FunctionCallback[] getToolCallbacks();//静态方法接口默认实现 ,不需要实现类实现public static ToolCallbackProvider from(List<? extends FunctionCallback> toolCallbacks) {return new StaticToolCallbackProvider(toolCallbacks);}public static ToolCallbackProvider from(FunctionCallback... toolCallbacks) {return new StaticToolCallbackProvider(toolCallbacks);}}

ToolCallbackProvider 得实现类图

在这里插入图片描述

在这里插入图片描述

打开源码 StaticToolCallbackProvider


public class StaticToolCallbackProvider implements ToolCallbackProvider {private final FunctionCallback[] toolCallbacks;// 可以使用构造器去实例化类,入参不能null 可以是空的数组public StaticToolCallbackProvider(FunctionCallback... toolCallbacks) {Assert.notNull(toolCallbacks, "ToolCallbacks must not be null");this.toolCallbacks = toolCallbacks;}public StaticToolCallbackProvider(List<? extends FunctionCallback> toolCallbacks) {Assert.noNullElements(toolCallbacks, "toolCallbacks cannot contain null elements");this.toolCallbacks = toolCallbacks.toArray(new FunctionCallback[0]);}// 必须实现父类的接口方法@Overridepublic FunctionCallback[] getToolCallbacks() {return this.toolCallbacks;}}

打开源码(MethodToolCallbackProvider)


package org.springframework.ai.tool.method;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.definition.ToolDefinition;
import org.springframework.ai.tool.metadata.ToolMetadata;
import org.springframework.ai.tool.util.ToolUtils;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.ReflectionUtils;import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class MethodToolCallbackProvider implements ToolCallbackProvider {private static final Logger logger = LoggerFactory.getLogger(MethodToolCallbackProvider.class);// 我们要实例化对象的属性private final List<Object> toolObjects;//构造器私有化了 不能new去实例化对象private MethodToolCallbackProvider(List<Object> toolObjects) {Assert.notNull(toolObjects, "toolObjects cannot be null");Assert.noNullElements(toolObjects, "toolObjects cannot contain null elements");this.toolObjects = toolObjects;}//实现接口默认方法@Overridepublic ToolCallback[] getToolCallbacks() {var toolCallbacks = toolObjects.stream().map(toolObject -> Stream.of(ReflectionUtils.getDeclaredMethods(toolObject.getClass())).filter(toolMethod -> toolMethod.isAnnotationPresent(Tool.class)).filter(toolMethod -> !isFunctionalType(toolMethod)).map(toolMethod -> MethodToolCallback.builder().toolDefinition(ToolDefinition.from(toolMethod)).toolMetadata(ToolMetadata.from(toolMethod)).toolMethod(toolMethod).toolObject(toolObject).toolCallResultConverter(ToolUtils.getToolCallResultConverter(toolMethod)).build()).toArray(ToolCallback[]::new)).flatMap(Stream::of).toArray(ToolCallback[]::new);validateToolCallbacks(toolCallbacks);return toolCallbacks;}//实现类自己的私有方法private boolean isFunctionalType(Method toolMethod) {var isFunction = ClassUtils.isAssignable(toolMethod.getReturnType(), Function.class)|| ClassUtils.isAssignable(toolMethod.getReturnType(), Supplier.class)|| ClassUtils.isAssignable(toolMethod.getReturnType(), Consumer.class);if (isFunction) {logger.warn("Method {} is annotated with @Tool but returns a functional type. "+ "This is not supported and the method will be ignored.", toolMethod.getName());}return isFunction;}//实现类自己的校验方法private void validateToolCallbacks(ToolCallback[] toolCallbacks) {List<String> duplicateToolNames = ToolUtils.getDuplicateToolNames(toolCallbacks);if (!duplicateToolNames.isEmpty()) {throw new IllegalStateException("Multiple tools with the same name (%s) found in sources: %s".formatted(String.join(", ", duplicateToolNames),toolObjects.stream().map(o -> o.getClass().getName()).collect(Collectors.joining(", "))));}}
//静态方法 构建器 直接用类.builder调用(创建型模式)public static Builder builder() {//使用 new 关键字 内部实例化对象return new Builder();}
//静态内部类,私有化构造器,只能在内部被实例化public static class Builder {// 接toolObjects方法的入参private List<Object> toolObjects;private Builder() {}public Builder toolObjects(Object... toolObjects) {Assert.notNull(toolObjects, "toolObjects cannot be null");//这个是Builder 的toolObjects 对象赋值this.toolObjects = Arrays.asList(toolObjects);//返回Builder对象return this;}public MethodToolCallbackProvider build() {//返回实例化并且初始化后的 MethodToolCallbackProvider 对象return new MethodToolCallbackProvider(toolObjects);}}}

mcp-client

先看一下项目的application.properties
我用硅基流的第三方模型,这个模型deepseek-ai/DeepSeek-R1-Distill-Qwen-7B是免费试用的。你们自己看情况去选择

server.port=8082spring.ai.openai.api-key=你自己的key
spring.ai.openai.base-url=https://api.siliconflow.cn
spring.ai.openai.chat.options.model=deepseek-ai/DeepSeek-R1-Distill-Qwen-7Bspring.ai.mcp.client.sse.connections.server1.url=http://localhost:8081
spring.ai.mcp.client.sse.toolcallback.enabled=true

客户端配置启动连接服务端

package com.example.client.config;import org.springframework.ai.chat.client.ChatClient;
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) {return builder.defaultSystem("你是一个智能AI管理员。")// 注册工具方法.defaultTools(toolCallbackProvider).build();}
}

使用对话

package com.example.client.controller;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;/*** 聊天控制器,处理AI聊天请求*/
@RestController
@RequestMapping("/c3")
public class ChatController {// 依赖注入bean初始化完的实例对象@Resourceprivate ChatClient chatClient;@RequestMapping("/api/chat")public String chat(@RequestParam String message) {// 使用API调用聊天String content = chatClient.prompt("你要问什么?").user(message).call().content();System.out.println(">>> 问题: " + message);System.out.println(">>> 回答:" + content);return content;}}

打开 ChatClient

ChatClient.Builder 有个默认实现类DefaultChatClientBuilder
ChatClient 本身是接口无法实现所以有一个DefaultChatClient 默认的实现类

public ChatClient build() {return new DefaultChatClient(this.defaultRequest);}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

结语

chatClient客户端对话就比较简单了,咱们多看看源码接口提供的方法,多看几遍在看网上的事例代码就容易多了。也可以自己尝试修改一些参数。

相关文章:

Spring-Ai-McpSever从外到内

MCP是什么 Model Context Protocol (MCP) 是一个开放协议&#xff0c;它使 LLM 应用与外部数据源和工具之间的无缝集成成为可能。无论你是构建 AI 驱动的 IDE、改善 chat 交互&#xff0c;还是构建自定义的 AI 工作流&#xff0c;MCP 提供了一种标准化的方式&#xff0c;将 LL…...

Vue多地址代理端口调用

第一种方法 config.ts文件 配置多条代理服务端口 如下所示:proxy: {/app: {// 其他的端口target: http://125.124.5.117:12877/,changeOrigin: true}/api: {//默认的端口// http://192.168.31.53:5173/target: http://192.168.31.199:18777/,changeOrigin: true,rewrite: pat…...

Android APP 热修复原理

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ dexElements Android 的 ClassLoader&#xff08;如 PathClassLoader、DexClassLoader&#xff09;内部结构如下&#xff1a; BaseDexClassLoader└── pat…...

一些有关ffmpeg 使用(1)

1 解封装流程 1.1 什么解封装 封装的逆向操作&#xff1a;封装是把音频流、视频流、字幕流等不同成分按一定规则组合成视频文件&#xff08;如 MP4、FLV &#xff09;&#xff0c;复用器负责此过程。解封装则相反&#xff0c;是用解复用器&#xff08;针对 MP4、FLV 等格式有…...

Postman-win64-7.2.2 安装教程(Windows 64位详细步骤)

1. 下载安装包 Postman-win64-7.2.2-Setup.exe下载链接&#xff1a;https://pan.quark.cn/s/6b48480d95d5 2. 运行安装程序 双击下载的 .exe 文件&#xff0c;启动安装向导。 若系统提示权限确认&#xff0c;点击 “是” 允许安装。 3. 安装向导设置 选择安装选项&#xff0…...

C语言实现贪心算法

一、贪心算法核心思想 特征&#xff1a;在每一步选择中都采取当前状态下最优&#xff08;局部最优&#xff09;的选择&#xff0c;从而希望导致全局最优解 适用场景&#xff1a;需要满足贪心选择性质和最优子结构性质 二、经典贪心算法示例 1. 活动选择问题 目标&#xff1a…...

Linux 服务如何使用 curl 利用 HTTP Get 请求传入 SQL 语句修改数据库表内容和结构

本文是博主在部署项目时发现的一个小技巧&#xff0c;项目部署在 Linux 虚拟机上&#xff0c;数据库被设置了写权限&#xff0c;作为开发只能使用程序对数据库做增删改查&#xff0c;但是在开发测试阶段会出现很多问题&#xff0c;权限的问题大大降低了开发效率&#xff0c;所以…...

Java对象转换的多种实现方式

Java对象转换的多种实现方式 在Java开发中&#xff0c;对象转换是一个常见的需求。特别是在不同层次间传递数据时&#xff0c;通常需要将一个对象转换为另一个对象。虽然JSON序列化/反序列化是一种常见的方法&#xff0c;但在某些场景下可能并不是最佳选择。本文将总结几种常见…...

详解 LeetCode 第 242 题 - 有效的字母组

目录 题目描述 解题思路 代码分析 步骤说明 图解原理 优势分析 小结 码题目&#xff1a;LeetCode 242. 有效的字母组 题目描述 给定两个字符串 s 和 t&#xff0c;请判断是否为字母组&#xff08;Anagram&#xff09;。 如果 t 是通过打乱 s 的字符并重新排列所得到的…...

【滑动窗口+哈希表/数组记录】Leetcode 3. 无重复字符的最长子串

题目要求 给定一个字符串 s&#xff0c;找出其中不含有重复字符的最长子串的长度。 子字符串是字符串中连续非空字符序列。 示例 1 输入&#xff1a;s "abcabcbb" 输出&#xff1a;3 解释&#xff1a;无重复字符的最长子串是 "abc"&#xff0c;长度为…...

springmvc-拦截器

目录 一&#xff0c;拦截器的职责 二&#xff0c;拦截器的应用场景 三&#xff0c;拦截器的工作原理 拦截器在Spring MVC请求处理流程中的位置&#xff1a; 四&#xff0c;使用拦截器 一 &#xff0c;编写拦截类&#xff0c;实现HandlerInterceptor接口&#xff0c;重写方…...

【Agent】LangManus深度解析:AI自动化框架的对比与langgraph原理

LangManus深度解析&#xff1a;AI自动化框架的技术演进与实践 本文将带你深入探索LangManus这一AI自动化框架的核心技术与其基于langgraph的实现原理&#xff0c;并与OpenManus进行全面对比&#xff0c;助你掌握多智能体系统的前沿技术。 本文3万字&#xff0c;没有时间的话可以…...

【FreeRTOS】事件标志组

文章目录 1 简介1.1事件标志1.2事件组 2事件标志组API2.1创建动态创建静态创建 2.2 删除事件标志组2.3 等待事件标志位2.4 设置事件标志位在任务中在中断中 2.5 清除事件标志位在任务中在中断中 2.6 获取事件组中的事件标志位在任务中在中断中 2.7 函数xEventGroupSync 3 事件标…...

如何通过电路测量运放的增益带宽积(GBP)和压摆率(SR)

一、增益带宽积&#xff08;GBP&#xff09;的测量 定义&#xff1a;增益带宽积是运算放大器的开环增益下降到直流增益的 ​&#xff08;即 - 3dB&#xff09;时对应的频率与该频率下增益的乘积&#xff0c;数学表达式为&#xff1a; 其中 A0​ 是直流开环增益&#xff0c;f0​…...

SAP接口超时:对 FOR ALL ENTRIES IN 的优化

SAP接口超时 经分析要10多分钟以上才出结果&#xff0c;且是这个语句耗时较长&#xff1a; SELECTaufnrmatnrbdmnglgortmeinschargFROM resbINTO CORRESPONDING FIELDS OF TABLE lt_lylcddxhFOR ALL ENTRIES IN lt_lylcddWHERE aufnr IN r_aufnr发现RESB有420万条记录&#xf…...

ElementUi的Dropdown下拉菜单的详细介绍及使用

Dropdown是 ElementUI 中用于创建下拉菜单项的一个组件&#xff0c;通常el-dropdown-item 包裹在 el-dropdown 组件中使用。以下从功能特性(一些属性及方法)、使用和高级功能(高亮显示&#xff0c;滚动&#xff0c;额外传参数)三个方面进行详细介绍。 一、功能特性 1.触发方式…...

C++类模板编程练习(从基础到进阶)

一、基础模板类设计 泛型盒子&#xff08;Box&#xff09; 实现一个 Box 类模板&#xff0c;存储任意类型的值&#xff0c;并提供获取/修改方法。 Box<int> intBox(42); cout << intBox.get(); // 输出 42 intBox.set(100);类型转换器&#xff08;Converter&…...

基于物联网的智能家居安全防护系统设计

资料下载地址&#xff1a;基于物联网的智能家居安全防护系统仿真&#xff08;仿真代码&#xff09; 目录 一、功能介绍 二、仿真图 三、程序 一、功能介绍 1.单片机和app、OneNet云平台通过wifi进行通信 2.马达模拟家里的用电设备&#xff0c;可通过按键开关 3.可检测用电量…...

android jatpack Compose 多数据源依赖处理:从状态管理到精准更新的架构设计

Android Compose 多接口数据依赖管理&#xff1a;ViewModel 状态共享最佳实践 &#x1f4cc; 问题背景 在 Jetpack Compose 开发中&#xff0c;经常遇到以下场景&#xff1a; 页面由多个独立接口数据组成&#xff08;如 Part1、Part2&#xff09;Part2 的某些 UI 需要依赖 P…...

非序列实现MEMS聚焦功能

zemax非序列模式下有MEMS,但是没有对应的代码。无法修改成自己需要的功能 以下是实现MEMS聚焦功能: #include <windows.h> #include <cmath> #include <stdio.h> #include <string.h> #include <algorithm> #undef max #undef min#define D…...

基于Java,SpringBoot,Vue,HTML宠物相亲配对婚恋系统设计

摘要 基于Java、SpringBoot、Vue和HTML的宠物相亲配对系统设计旨在为宠物主人打造一个高效、智能的宠物社交与配对平台。系统采用前后端分离架构&#xff0c;前端基于Vue.js框架结合HTML/CSS/JavaScript构建动态交互界面&#xff0c;实现宠物信息展示、用户社交互动等功能&…...

AI大模型学习十二:‌尝鲜ubuntu 25.04 桌面版私有化sealos cloud + devbox+minio对象存储测试和漫长修改之路

一、说明 前面已经安装完成&#xff0c;这里我们测试对象存储 AI大模型学习十一&#xff1a;‌尝鲜ubuntu 25.04 桌面版私有化sealos cloud devboxminio&#xff0c;实战运行成功-CSDN博客https://blog.csdn.net/jiangkp/article/details/147424823?spm1011.2415.3001.5331 二…...

身份与访问管理(IAM):零信任架构下的认证授权技术与实战

身份与访问管理&#xff08;IAM&#xff09;&#xff1a;零信任架构下的认证授权技术与实战 在网络安全防御体系中&#xff0c;身份与访问管理&#xff08;Identity and Access Management, IAM&#xff09;是守护数字资产的“数字门禁系统”。随着远程办公和多云架构的普及&a…...

潮了 低配电脑6G显存生成60秒AI视频 本地部署/一键包/云算力部署/批量生成

最近发现了一个让人眼前一亮的工具——FramePack&#xff0c;它能用一块普通的6GB显存笔记本GPU&#xff0c;生成60秒电影级的高清视频画面&#xff0c;效果堪称炸裂&#xff01;那么我们就把他本地部署起来玩一玩、下载离线一键整合包&#xff0c;或者是用云算力快速上手。接下…...

高防IP+CDN组合:电商大促的“双保险”防护方案

引言 电商大促期间&#xff0c;平台流量呈爆发式增长&#xff0c;既要应对瞬时激增的访问量&#xff0c;又要防范黑客趁机发起的DDoS攻击、恶意爬虫等威胁。单一防护手段往往难以兼顾性能与安全&#xff0c;而高防IPCDN组合通过“流量清洗加速分发”的双重机制&#xff0c;为电…...

“IAmMusicFont.com“:将音乐变成视觉

很高兴向大家介绍——IAmMusicFont.com&#xff0c;这是一个专为音乐爱好者和设计师打造的在线字体生成器&#xff0c;灵感源自Playboi Carti 2025年专辑《MUSIC》&#xff08;又称"I Am Music"&#xff09;的标志性封面设计。 什么是"I am music font"&a…...

C++入门(下)

本文为个人学习笔记&#xff0c;如有错误欢迎批评指正&#xff0c;如有侵权&#xff0c;请联系删除。 今日名言&#xff1a; 好运只是个副产品&#xff0c;只有当你不带任何私心杂念&#xff0c;单纯的去做事情时&#xff0c;他才会降临。 上一篇文章我们讲了C入门的一部分内容…...

ubuntu22.04 命令行修改静态ip

传统interfaces文件配置&#xff08;适用于旧版&#xff09;即便我们已经在桌面上配置了固定ip 这里也可以修改 ‌编辑配置文件‌ 修改/etc/network/interfaces&#xff08;需安装net-tools&#xff09;&#xff1a; # interfaces(5) file used by ifup(8) and ifdown(8) # In…...

Ubuntu18.04配置C++环境和Qt环境

Ubuntu18.04配置C环境和Qt环境 1、前言3.2 安装其他库3.3 查看有没有安装成功3.4测试C环境 4、配置Qt环境4.1 安装相关的库4.2 测试 5、总结 1、前言 记录一下Ubuntu18.04配置C环境和Qt环境的过程&#xff0c;方便自己日后回顾&#xff0c;也可以给有需要的人提供帮助。 # 2…...

深度学习--自然语言处理统计语言与神经语言模型

文章目录 前言一、语言转换方法1、数据预处理2、特征提取3、模型输入4、模型推理 二、语言模型1、统计语言模型1) 机器学习词向量转换2&#xff09;解释&#xff1a;3) 统计语言模型存在的问题 2、神经语言模型1&#xff09;one—hot编码2&#xff09;解决维度灾难3&#xff09…...

linux ptrace 图文详解(七) gdb、strace跟踪系统调用

目录 一、gdb/strace 跟踪程序系统调用 二、实现原理 三、代码实现 四、总结 &#xff08;代码&#xff1a;linux 6.3.1&#xff0c;架构&#xff1a;arm64&#xff09; One look is worth a thousand words. —— Tess Flanders 相关链接&#xff1a; linux ptrace 图…...

Feign接口调用失败降级机制

是的&#xff0c;通过 FallbackFactory 实现的降级逻辑在 Feign 接口调用失败时会被触发&#xff0c;但需要注意以下关键点以确保降级生效&#xff1a; 一、代码有效性分析 降级逻辑是否生效&#xff1f; • 是的&#xff0c;当 Feign 调用 BaseServiceFeign 接口的 updateMoni…...

系统架构-安全架构设计

概述 对于信息系统来说&#xff0c;威胁有&#xff1a;物理环境&#xff08;最基础&#xff09;、通信链路、网络系统、操作系统、应用系统、管理系统 物理安全&#xff1a;系统所用设备的威胁&#xff0c;如自然灾害、电源故障通信链路安全&#xff1a;在传输线路上安装窃听…...

python实现简单的UI交互

文章目录 1. 基础打印 覆盖同一行2. 多行动画效果3. 彩色文本&#xff08;Windows/macOS/Linux&#xff09;4. 输入交互5. 异步输入与非阻塞显示6. 高级控制台 UI 库 可以通过控制台打印实现简单的「伪UI交互」&#xff0c;尤其适合展示进度、动态文本或轻量级状态反馈。以下是…...

高频面试题:如何保证数据库和es数据一致性

背景 在实际项目开发中&#xff0c;我们经常将MySQL作为业务数据库&#xff0c;ES作为查询数据库&#xff0c;用来实现读写分离&#xff0c;缓解MySQL数据库的查询压力&#xff0c;应对海量数据的复杂查询&#xff0c;这其中有一个很重要的问题&#xff0c;就是如何实现MySQL数…...

CS001-7-hbao

HBAO https://zhuanlan.zhihu.com/p/348467142 HBAO(屏幕空间的环境光遮蔽) - 知乎 (zhihu.com) [摸着原神学图形]HBAO实现与优化 - 知乎 (zhihu.com) https://zhuanlan.zhihu.com/p/367793439 Global Illumination_Horizon-Based Ambient Occlusion(HBAO)-CSDN博客 这个解…...

使用npm install或cnpm install报错解决

1.从git上拉了一个新vue项目npm install 报错如下 解决办法&#xff1a; 清除npm缓存 npm cache clean -force 2.阿里云镜像证书过期&#xff0c;报错如下 解决办法&#xff1a; 更换阿里云镜像地址 #原来的地址是&#xff1a;https://registry.npm.taobao.org/ cnpm confi…...

Electron Forge【实战】阿里百炼大模型 —— AI 聊天

获取 apiKey 登录并开通阿里云百炼 https://bailian.console.aliyun.com/#/home 新人有半年免费的使用福利&#xff0c;在模型详情中&#xff0c;可以查看剩余的免费额度 https://bailian.console.aliyun.com/?tabmodel#/model-market/detail/qwen-turbo 在下方链接中创建 ap…...

Vue3实现高仿word自定义颜色选择器组件(支持 v-model)

目录 Vue3实现高仿word自定义颜色选择器组件&#xff08;支持 v-model&#xff09;需求分析大致效果需求功能实现所需技术从UI哪里拿到主题颜色标准色进行子主组件的v-model实现子组件布局实现子组件样式实现子组件全部代码&#xff1a;父组件调用方式完结 Vue3实现高仿word自定…...

.NET中,const和readonly区别

在.NET中&#xff0c;const和readonly都用于定义不可变的值&#xff0c;但它们在行为和使用场景上有显著区别。以下是两者的详细对比&#xff1a; 初始化时机 • const ◦ 编译时常量&#xff0c;必须在声明时赋值。 ◦ 值在编译时确定&#xff0c;并被直接嵌入到IL代码中&…...

力扣-206.反转链表

题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 class Solution { public:ListNode* reverseList(ListNode* head) {//头插法ListNode *p head;headnullptr;ListNode *temp nullptr;while (p! nullptr){tempp;pp->next;tem…...

五一去荣昌吃卤鹅?基于Java和天地图的寻找荣昌卤鹅店实践

目录 前言 1、卤鹅哥与甲亢哥的爆火事件 2、荣昌卤鹅产业的空间分布 3、使用Java 和天地图进行产业挖掘 一、地名检索简介 1、地名检索功能 2、地名检索API介绍 二、荣昌卤鹅检索实践 1、数据获取流程 2、天地图API请求构建 3、参数构建及调用 4、结果生成及本地保存…...

力扣-160.相交链表

题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返…...

CSS Position 属性完全指南

CSS 中的 position 属性是布局的基础&#xff0c;它决定了元素在页面中的定位方式。理解各种定位值的行为和适用场景对于构建灵活、响应式的布局至关重要。 position 属性的五个主要值 1. static&#xff08;默认值&#xff09; 元素遵循正常的文档流不受 top, right, botto…...

热度上升,25西电机电工程学院(考研录取情况)

1、机电工程学院各个方向 2、机电工程学院近三年复试分数线对比 学长、学姐分析 由表可看出&#xff1a; 1、力学25年相较于24年下降35分&#xff0c;为255分 2、机械工程25年相较于24年下降15分&#xff0c;为320分 3、仪器科学与技术25年相较于24年上升35分&#xff0c;为…...

R7周:糖尿病预测模型优化探索

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 一、数据预处理 1.设置GPU import torch.nn.functional as F import torch.nn as nn import torch, torchvisiondevice torch.device("cuda"…...

使用Go语言实现轻量级消息队列

文章目录 一、引言1.1 消息队列的重要性1.2 为什么选择Go语言1.3 本文实现的轻量级消息队列特点 二、核心设计2.1 消息队列的基本概念2.1.1 消息类型定义2.1.2 消息结构设计 2.2 架构设计2.2.1 基于Go channel的实现方案2.2.2 单例模式的应用2.2.3 并发安全设计 2.3 消息发布与…...

QT窗口相关控件及其属性

widget&#xff0c;PushButton&#xff0c;lineEdit等都是基于QWidget延展出来的 并不是完整的窗口&#xff0c;而是作为窗口的一部分 真正的窗口是QMainWindow 菜单栏 Qt中的菜单栏是通过QMenuBar这个类来实现的&#xff0c;一个主窗口最多只有一个菜单栏&#xff0c;位于主…...

OceanBase 复合索引指南

一、 什么是复合索引&#xff0c;与单列索引的区别是什么 1.1 什么是复合索引 复合索引是指在数据库表中由两个或更多列共同构成的索引&#xff0c;也称多列索引。其独特之处在于&#xff0c;它并非仅针对单一列建立索引&#xff0c;而是对多个列的组合进行索引&#xff0c;从…...

蛋白质大语言模型ESM介绍

ESM(Evolutionary Scale Modeling)是 Meta AI Research 团队开发的一系列用于蛋白质的预训练语言模型。这些模型在蛋白质结构预测、功能预测和蛋白质设计等领域展现出了强大的能力。以下是对 ESM 的详细介绍: 核心特点 大规模预训练:基于大规模蛋白质序列数据进行无监督学…...