【AI智能体】Spring AI MCP 从使用到操作实战详解

article/2025/7/13 14:11:28

目录

一、前言

二、MCP 介绍

2.1 什么是MCP

2.2 MCP 核心特点

2.3 MCP 核心价值

2.4 MCP 与Function Calling 区别

三、Spring AI MCP 架构介绍

3.1 整体架构

3.1.1 三层架构实现说明

3.2 服务端与客户端

3.2.1 MCP 服务端

3.2.1 MCP 客户端

3.3 MCP中SSE和STDIO区别

3.3.1 SSE模式介绍

3.3.2 STDIO模式介绍

3.3.3 SSE 与STDIO对比

四、Spring AI MCP 案例操作演示

4.1 开发环境准备

4.2 构建MCP Server服务

4.2.1 pom导入下面的依赖

4.2.2 添加配置文件

4.2.3 提供一个Tool 工具类

4.2.4 注册工具类

4.3 构建MCP Client服务

4.3.1 导入核心依赖

4.3.2 增加配置信息

4.3.3 增加一个对话接口

4.3.4 效果测试

4.4 MCP 底层原理解析

4.4.1 server端底层执行逻辑

4.4.2 client 端底层执行逻辑

五、写在文末


一、前言

Spring AI MCP 是 Spring 框架对模型上下文协议(Model Context Protocol, MCP)的官方实现,它为 Java 开发者提供了标准化集成大型语言模型(LLM)与外部数据源和工具的能力。本文将全面介绍 Spring AI MCP 的核心概念、架构设计以及实际应用方法。

二、MCP 介绍

2.1 什么是MCP

MCP ,即模型上下文协议(Model Context Protocol, MCP),由 Anthropic 公司(Claude 大模型母公司)在 2024 年 11 月推出的开放协议,旨在标准化大型语言模型与外部数据源和工具之间的交互方式。MCP 被形象地比喻为 AI 领域的"USB-C 接口",因为它提供了连接各类服务的统一框架。从而增强模型的实时交互和任务执行能力。

2.2 MCP 核心特点

MCP 具备如下核心特点:

  • 标准化集成

    • MCP统一了不同AI模型(如Claude、GPT等)与外部工具(如数据库、API、浏览器等)的交互方式,避免了传统定制化API开发的重复劳动

  • 双向通信

    • 不同于传统AI只能被动接收数据,MCP支持AI主动检索信息并执行操作(如更新数据库、触发工作流),实现真正的“代理式AI”

  • 动态上下文管理

    • MCP允许AI在会话中持续携带上下文信息(如用户偏好、历史记录),使多步骤任务(如“查询天气→推荐行程→预订酒店”)能自动串联执行

  • 安全与灵活性

    • MCP支持本地或云端部署,通过OAuth 2.1认证和数据沙箱机制保障敏感信息的安全访问

2.3 MCP 核心价值

MCP 解决了 AI 应用开发中的几个关键问题:

  • 打破数据孤岛:让大模型可以直接访问实时数据和本地资源(如数据库、文件系统)

  • 降低开发成本:开发者只需编写一次 MCP 服务端,所有兼容 MCP 的模型都能调用

  • 提升安全性:内置权限控制和加密机制,比直接开放数据库更安全

  • 促进生态统一:类似 USB 接口,让不同厂商的工具能"即插即用"

2.4 MCP 与Function Calling 区别

与传统的 Function Calling 相比,MCP 具有以下优势:

  • 复用性:Function Calling 通常与具体 AI 应用紧密绑定,难以复用;而 MCP 设计用于跨系统、跨工具场景

  • 交互能力:MCP 着重解决系统间交互问题,使数据和功能能在不同系统间灵活传递

  • 协议标准化:MCP 通过协议标准化简化了分布式系统开发

三、Spring AI MCP 架构介绍

spring官网在大模型开始火热的时候,推出了Spring AI,与时俱进,随着MCP的热度走高,Spring AI MCP也随之推出与大众见面,官网入口:Model Context Protocol (MCP) :: Spring AI Reference

3.1 整体架构

Spring 官网对于MCP给出了下面的架构图

Spring AI MCP 采用模块化架构,包含以下核心组件:

  • Spring AI 应用程序:使用 Spring AI 框架构建的生成式 AI 应用

  • Spring MCP 客户端:MCP 协议的 Spring AI 实现,与服务器保持 1:1 连接

  • MCP 服务器:轻量级程序,通过标准化协议公开特定功能

  • 本地数据源:MCP 服务器可安全访问的计算机文件、数据库和服务

  • 远程服务:MCP 服务器可通过互联网(如 API)连接的外部系统

3.1.1 三层架构实现说明

Java MCP 实现遵循三层架构:

  • 客户端/服务器层:McpClient 处理客户端操作,McpServer 管理服务器端协议操作

  • 会话层(McpSession):管理通信模式和状态

  • 传输层(McpTransport):处理 JSON-RPC 消息的序列化和反序列化,支持多种传输方式

3.2 服务端与客户端

在实际开发和使用时,MCP的开发主要涉及到服务端与客户端,两者的作用各有差异,下面分别做说明。

3.2.1 MCP 服务端

MCP 服务端主要负责下面的功能:

  • 服务端协议操作实现

  • 工具暴露与发现

  • 基于 URI 的资源管理

  • 提示词模板的提供与处理

  • 客户端并发连接管理

3.2.1 MCP 客户端

MCP 客户端是架构中的关键组件,其主要负责下面的功能:

  • 协议版本协商

  • 能力协商以确定可用功能

  • 消息传输和 JSON-RPC 通信

  • 工具发现和执行

  • 资源访问和管理

  • 支持同步和异步操作

3.3 MCP中SSE和STDIO区别

在Spring AI的MCP实现中,SSE和STDIO是两种主要的通信方式,它们各自适用于不同的场景,下面我们来详细分析两者的区别。

3.3.1 SSE模式介绍

SSE全称,Server-Sent Events,是一种服务器推送技术,允许服务器向客户端推送实时更新。在MCP中,SSE主要用于流式返回AI模型生成的内容。其主要特点如下:

  • 单向通信:服务器向客户端发送数据,客户端不能通过SSE向服务器发送数据

  • 实时性:支持服务器实时推送数据到客户端

  • 自动重连:客户端断开连接后会自动尝试重新连接

  • 基于HTTP:使用标准HTTP协议,易于穿越防火墙

  • 轻量级:相比WebSocket更加轻量,适合单向通信场景

在AI大模型中的交互使用场景:

  • 流式返回模型生成的文本,实现类似打字机的效果;

  • 提供实时反馈,如生成进度、中间结果等;

  • 减少首字节时间(TTFB),提升用户体验;

SSE的HTTP格式示例:

HTTP/1.1 200 OK
Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alivedata: {"content":"这是第一段对话"}data: {"content":"这是第二段对话"}data: {"content":"这是最后一段对话"}data: [DONE]

3.3.2 STDIO模式介绍

STDIO全称,Standard Input/Output,STDIO 是指标准输入输出流,是一种最基本的程序通信机制。在MCP中,STDIO主要用于与本地部署的模型或通过命令行工具访问的模型进行交互。STDIO主要有如下特点:

  • 双向通信

    • 程序可以通过标准输入接收数据,通过标准输出发送数据

  • 进程间通信

    • 通常用于父子进程之间的通信

  • 无网络依赖

    • 不依赖网络协议,适合本地应用场景

  • 命令行友好

    • 与命令行工具天然集成

  • 低开销

    • 通信开销小,适合高性能场景

在AI大模型中的交互使用场景:

  • 与本地部署大模型交互,如Ollama、LLaMA.cpp等

  • 通过命令行工具访问AI大模型服务

  • 构建管道式AI处理流程

STDIO 通信流程如下示例:

应用程序 -> 标准输入 -> AI模型进程 -> 标准输出 -> 应用程序

3.3.3 SSE 与STDIO对比

SSE 与STDIO两种模式具有如下差异:

特征项

SSE

STDIO

通信方向

单向 :服务器到客户端

双向

网络依赖

依赖HTTP

不依赖网络

部署要求

需要网络服务

本地即可

性能开销

较高(HTTP开销)

较低

扩展性

支持多客户端

一对一通信

实现复杂度

中等

简单

错误恢复

自动重连机制

需手动处理

应用场景

网络API通信

本地进程通信

四、Spring AI MCP 案例操作演示

接下来通过一个实际案例详细演示基于SSE 这种模式下Spring AI MCP是如何使用的。

mcp项目分为server服务端(提供mcp服务),client客户端(去请求mcp服务)

4.1 开发环境准备

本地开发环境相关的组件依赖版本如下:

  • JDK17

  • maven 3.6.2

  • springBoot 3.4.4

  • springAi 1.0.0-M7

4.2 构建MCP Server服务

下面以SSE模式为例演示下如何在springboot项目中集成并使用MCP

4.2.1 pom导入下面的依赖

创建一个springboot的server端项目,导入下面的核心依赖

<properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring-ai.version>1.0.0-M7</spring-ai.version>
</properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.4</version><relativePath/>
</parent><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-M7</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server-webflux</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency>
</dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build><repositories><repository><id>central</id><url>https://maven.aliyun.com/repository/central</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</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><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>
</repositories>

4.2.2 添加配置文件

在配置文件中添加如下信息

spring:ai:mcp:server:name: mcp-serverversion: 1.0.0type: ASYNCsse-message-endpoint: /mcp/messages

4.2.3 提供一个Tool 工具类

在MCP的实现中,Tool 是一个很重要的连接点,借助Tool ,客户端调用具体的服务时,可以理解为MCP就能找到符合要求的Tool 实现,从而给客户端预期的响应结果,在server项目启动的时候,会将相关的Tool工具进行注册,统一汇聚在一个类似于服务注册中心的列表上去,客户端通过配置Server的地址后,就能进行调用,在下面的类中,提供了2个工具方法,第一个是模拟调用天气的API获取天气信息,第二个是获取用户所在的时区时间。

package com.congge.tool;import org.springframework.ai.tool.annotation.Tool;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;import java.time.LocalDateTime;@Service("weatherServiceTool")
public class WeatherServiceTool {@Tool(description = "获取指定城市的天气")public String getWeather(String cityName){if(cityName.equals("北京")){return "晴天";}else if(cityName.equals("上海")){return "阴天";}else {return "未知";}}@Tool(description = "获取当前用户所在的时区时间")String getCurrentDateTime() {return LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();}}

4.2.4 注册工具类

提供一个配置类,将上述的Tool工具类进行注册

package com.congge.config;import com.congge.tool.WeatherServiceTool;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ToolCallbackProviderConfig {@Beanpublic ToolCallbackProvider toolCallbackProvider(WeatherServiceTool weatherServiceTool) {return MethodToolCallbackProvider.builder().toolObjects(weatherServiceTool).build();}
}

其实到这里基本上就结束了,如果在server工程中,还需要提供接口,继续添加即可,在实际开发中,server端主要是提供针对各类场景下的tool服务,接下来启动工程,在控制台的启动日志中可以看到成功注册了两个服务。

4.3 构建MCP Client服务

4.3.1 导入核心依赖

在pom文件中导入下面的核心依赖,基本和server端的相同,注意版本号保持一致,在client端,主要增加了mcp-client的依赖,以及阿里的spring-ai的依赖,参考下面的依赖信息:

<properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring-ai.version>1.0.0-M7</spring-ai.version>
</properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.4</version><relativePath/>
</parent><dependencies><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter</artifactId><version>1.0.0-M6.1</version></dependency><!--<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId><version>1.0.0-M6</version></dependency>--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency>
</dependencies><repositories><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></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><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>
</repositories><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-M7</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

4.3.2 增加配置信息

在配置文件中增加下面的信息

server:port: 8082spring:ai:dashscope:api-key: 你的apikey  #这里使用阿里云百炼平台的apikeymcp:client:sse:connections:server1:url: http://localhost:8080toolcallback:enabled: true

4.3.3 增加一个对话接口

增加一个测试用的聊天对话接口,用于测试客户端调用server的服务是否正常,参考下面的代码

package com.congge.web;import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/client/ai")
public class ChatController {private final ChatClient chatClient;public ChatController(ChatClient.Builder chatClientBuilder) {this.chatClient = chatClientBuilder.build();}@Resourceprivate ToolCallbackProvider toolCallbackProvider;//localhost:8082/client/ai/chat?message=今天北京的天气如何//localhost:8082/client/ai/chat?message=你是谁//localhost:8082/client/ai/chat?message=当前时间是多少@GetMapping("/chat")public String chat(String message){return chatClient.prompt().user(message).tools(toolCallbackProvider.getToolCallbacks()).call().content();}
}

4.3.4 效果测试

启动上面client的服务,依次调用几个接口测试下是否能够成功调用到server端的服务。

1)测试效果一

调用接口:localhost:8082/client/ai/chat?message=今天北京的天气如何 ,在server端,提供了一个获取天气信息的模拟接口,所以在下面的接口响应中可以看到正常返回结果

2)测试效果二

调用接口:localhost:8082/client/ai/chat?message=你是谁 ,这是一个与server端2个工具方法无关的问题,所以最后由大模型返回的响应结果

3)测试效果三

调用接口:localhost:8082/client/ai/chat?message=当前时间是多少 ,server中提供了获取时间的工具方法,所以在调用结果中可以看到返回了预期的结果

4.4 MCP 底层原理解析

在上面的案例中,演示了如何在client端调用server端的tool服务,于是细心的伙伴会问,这是怎么实现的呢?clent端怎么就能准确的调用到server端提供的服务了呢?下面简单说明下其底层的实现原理。

4.4.1 server端底层执行逻辑

在server端工程中,代码中搜索这个McpAsyncServer类,server端项目启动的时候,通过这个类的执行,将tool的相关方法注册到一个指定的位置,然后暴露出去,从而客户端只要配置了与server端的连接,即可获取到这些tool列表,类似于我们在使用nacos之类的服务注册中心时候,只要服务消费者连上注册中心,就可以获取并使用上面注册的服务列表类似的道理。

在这个类中,提供了多个与Tool相关的方法,如下:

启动server工程,首先进入了该类的构造方法中,走到构造方法中,可以看到获取到了工程中提供的2个tool方法

同时在下面这段代码中,暴露了一个重要的端口: tools/list ,简单理解就是为客户端暴露了一个获取server端工具列表的接口

  • tools/list ,暴露工具列表;

  • tools/call,执行工具调用;

4.4.2 client 端底层执行逻辑

在客户端,在上面的案例演示中看到,在配置文件中配置了连接server端的IP+端口号,然后在接口中注入相关的类就可以调用了,简单理解就是,通过这样的配置之后,客户端在发起对server端的tool方法调用时,从tool列表中找到合适的tool,然后执行调用,从而返回预期的结果。

在client端代码中,通过ToolCallbackProvider这个接口进入,可以看到,这是一个接口,里面对应了多个具体的实现类,不同的实现对应了不同场景下对于tool的调用模式,在上述的案例代码中,对应的便是下面这个SyncMcpToolCallbackProvider类的代码执行

在启动工程之后,通过一次接口调用后,来到下面的McpSyncClient这个类的代码中,首先会执行下面的listTools方法,获取当前客户端能够拿到的tool列表,通过debug代码可以看到已经拿到了server端提供的2个tool

通过中间一些列的过滤、筛选得到具体执行的那个tool,然后执行本类中的callTool方法,而且是一个同步阻塞方法,需要等待执行结果的返回

继续往下走,就看到了在上一个解析server端源码中的那个 tools/call的接口了,在这里相当于是客户端找到了具体的执行tool之后,向server端发起request,然后等待server的执行结果

五、写在文末

本文详细介绍了Spring AI MCP的相关技术,并通过一个实际案例操作演示了在SSE模式下MCP的实战应用,事实上,使用Spring AI对接和整合MCP还有很多技能可以解锁,比如stdio模式下的使用,整合第三方的MCP服务等,限于篇幅原因,有兴趣的同学可以基于此继续深入研究,在后续的篇章中也会逐渐丰富和完善,本篇到此结束,感谢观看。


http://www.hkcw.cn/article/TRehAINLhC.shtml

相关文章

Python打卡DAY43

复习日 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 进阶&#xff1a;并拆分成多个文件 我选择ouIntel Image Classification | Kagglezz&#xff0c;该数据集分为六类&#xff0c;包含建筑、森林、冰川、山脉、海洋和街道…

香橙派3B学习笔记5:Linux文件系统分区_A/B系统分区

经过之前的多次分区失败导致系统重启无法进入&#xff0c;这次调整思路重新分区 ssh &#xff1a; orangepi本地ip 密码 &#xff1a; orangepi 操作系统发行版&#xff1a; 基于 Ubuntu 20.04.6 LTS&#xff08;Focal Fossa&#xff09;的定制版本&#xff0c;专门为 Orange …

第16讲、Odoo 18 序号(Sequence)详解

目录 序号系统概述底层实现原理常见序号规则使用方法与最佳实践案例分析&#xff1a;客户工单管理系统常见问题与解决方案总结 序号系统概述 Odoo 中的序号&#xff08;Sequence&#xff09;系统是一个用于生成唯一标识符的核心机制&#xff0c;主要用于为业务单据&#xff…

内存管理--《Hello C++ Wrold!》(8)--(C/C++)--深入剖析new和delete的使用和底层实现

文章目录 前言C/C内存分布new和deletenew和delete的底层定位new表达式 内存泄漏作业部分 前言 在C/C编程中&#xff0c;内存管理是理解程序运行机制的核心基础&#xff0c;也是开发高效、稳定程序的关键。无论是局部变量的存储、动态内存的分配&#xff0c;还是对象生命周期的…

Linux之进程间通信

目录 一、进程间通信介绍 1.1、进程间通信目的 1.2、进程间通信发展 1.3、进程间通讯分类 二、管道 三、匿名管道 3.1、示例代码 完整重定向问题&#xff1a; 3.2、⽤ fork 来共享管道原理 3.3、站在⽂件描述符⻆度-深度理解管道 3.4、站在内核⻆度-管道本质 3.5、…

京东轨迹验证码识别代码

一、简介 这个是最新的京东轨迹验证码&#xff0c;需要用户根据轨迹画出对应的曲线。这个和传统的验证码有较大的差异&#xff0c;有非常大的难度。经过长时间的研究&#xff0c;现在终于解决了它的识别问题。 这个是识别效果&#xff0c;和真实轨迹基本上重合&#xff0c;所以…

【Godot】如何导出 Release 版本的安卓项目

在使用 Godot 引擎开发安卓游戏或应用时&#xff0c;发布到应用市场&#xff08;如 Google Play、华为应用市场等&#xff09;通常需要生成一个 Release 版本的 .apk 包&#xff0c;而非 Debug 版本。本文将详细介绍如何将 Godot 项目导出为 Release 版本的安卓项目&#xff0c…

哈喽,我是钓鱼的肝

我嘛&#xff0c;一个五年级的小猴子&#xff0c;哦不&#xff0c;小孩子&#xff0c;给大家看看我长什么样子 呃&#xff0c;放错了 别想了&#xff0c;等你关注我再说 我写博客的缘由就是想让大家一起见证我的进步&#xff0c;二是把我的学习成果让更多人看见&#xff0c;三…

【Linux】网络--网络层--IP协议

个人主页~ 网络--网络层--IP协议 一、基本概念二、IP报头格式三、网络划分四、私有IP和公网IP五、路由路由表 六、与数据链路层之间的协议 一、基本概念 IP 协议是用于在互联网上进行数据传输的一种网络层协议&#xff0c;它为不同网络中的设备提供了一种统一的方式来交换数据…

MCP (模型上下文协议):AI界的“USB-C”标准,开启大模型应用新纪元

今天我们来聊聊一个可能深刻改变 AI 应用开发模式的新技术——MCP (Model Context Protocol&#xff0c;模型上下文协议)。这是由 Anthropic 公司&#xff08;旗下拥有知名大模型 Claude&#xff09;提出的一项旨在统一大模型与外部世界交互方式的“万能接口”。不妨把它想象成…

Python数学可视化——显函数、隐函数及复杂曲线的交互式绘图技术

Python数学可视化——显函数、隐函数及复杂曲线的交互式绘图技术 一、引言 在科学计算和数据分析中&#xff0c;函数与方程的可视化是理解数学关系和物理现象的重要工具。本文基于Python的Tkinter和Matplotlib库&#xff0c;实现一个功能完善的函数与方程可视化工具&#xff…

SpringBoot(六)--- AOP、ThreadLocal

目录 前言 一、AOP基础 1.入门程序 2. AOP核心概念 3. 底层原理 二、AOP进阶 1.通知类型 抽取切入点 2. 切入点表达式 2.1 execution 2.2 annoation 2.3 连接点详解 三、ThreadLocal 前言 AOP&#xff08;面向切面编程&#xff09;&#xff0c;面向切面编程实际就…

贪心算法应用:在线租赁问题详解

贪心算法应用&#xff1a;在线租赁问题详解 贪心算法是一种在每一步选择中都采取当前状态下最优的选择&#xff0c;从而希望导致结果是全局最优的算法策略。在线租赁问题(Greedy Algorithm for Online Rentals)是一个经典的贪心算法应用场景&#xff0c;下面我将从多个维度全面…

BA-SAM: 用于 Segment Anything 模型的可扩展偏置模式注意力掩码

概要 在本文中&#xff0c;我们解决了 Segment Anything Model &#xff08;SAM&#xff09; 的图像分辨率变化挑战。SAM 以其零样本泛化性而闻名&#xff0c;当面对具有不同图像大小的数据集时&#xff0c;性能会下降。以前的方法倾向于将图像大小调整为固定大小或采用结构修改…

centos8修改IP地址和Hostname

修改ip地址 vim /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTO&#xff1a;设置为 static 表示使用静态 IP 地址。 IPADDR&#xff1a;设置新的 IP 地址。 NETMASK&#xff1a;设置子网掩码。 GATEWAY&#xff1a;设置默认网关&#xff08;可选&#xff0c;但通常需要…

Python Day40 学习(复习学习日志Day5-7)

重新对信贷数据集进行了填补空缺值的操作 自己写的时候&#xff0c;还是出现了问题&#xff1a; 首先是忘记了要定义一下data, 通过data pd.read_csv(data.csv)可以将读取到的数据保存到变量data中&#xff0c;方便后续进行数据分析。 其次&#xff0c;是漏掉了 c data.col…

QML 粒子系统之Affector

目录 基本示例AffectorAge - 改变特定年龄粒子的属性Attractor - 吸引粒子到指定点Friction - 施加摩擦力Gravity - 模拟重力Wander - 随机游走效果Turbulence - 添加湍流效果 下载链接 接上篇QML 粒子系统 (雪花飘落、爆炸粒子效果)&#xff0c;本文继续研究粒子系统中的附属效…

Mac 同时录制系统声音和麦克风声音(OBS + BlackHole 免费版)

&#x1f3ac; 一、你将实现的目标 ✅ 用 OBS 免费录制屏幕时&#xff0c;能同时录到&#xff1a; &#x1f5a5; 系统播放的声音&#xff08;比如视频、PPT音效、背景音乐&#xff09; &#x1f399; 你的麦克风说话声音&#xff08;讲解或旁白&#xff09; &#x1f9f0;…

Pytorch知识点2

Pytorch知识点 1、官方教程2、张量&#x1f9f1; 0、数组概念&#x1f9f1; 1. 创建张量&#x1f4d0; 2. 张量形状与维度&#x1f522; 3. 张量数据类型➗ 4. 张量的数学与逻辑操作&#x1f504; 5. 张量的就地操作&#x1f4e6; 6. 复制张量&#x1f680; 7. 将张量移动到加速…

使用pandas实现合并具有共同列的两个EXCEL表

表1&#xff1a; 表2&#xff1a; 表1和表2&#xff0c;有共同的列“名称”&#xff0c;而且&#xff0c;表1的内容&#xff08;行数&#xff09;<表2的行数。 目的&#xff0c;根据“名称”列的对应内容&#xff0c;将表2列中的“所处行业”填写到表1相应的位置。 实现代…