目录

掌握 Cursor 基础

1. Cursor 安装与基本设置

什么是 Cursor?

Cursor 是一款 AI 驱动的代码编辑器 (IDE),专为开发者设计,能够理解你的代码和意图,提供代码补全、重构建议,甚至可以帮你生成完整的代码片段。在进入 AI 代理时代后,Cursor 的 AI 代理功能,进一步以自动化的方式,协助开发者完成任务。

下载安装

  1. 访问官网:前往 cursor.sh
  2. 选择版本:根据操作系统下载对应版本
  3. 安装程序:运行安装程序,按照向导完成安装
  4. 首次启动:启动 Cursor,完成初始设置

初始配置

# 安装完成后,首次启动会引导你进行以下配置:
1. 选择主题(深色/浅色)
2. 配置 AI 模型(Claude 3.5 Sonnet 或其他)
3. 设置快捷键偏好
4. 选择扩展插件

2. AI 程式助手 (Coding Assistant) 与 AI 代理 (Coding Agent) 有什么不同?

AI 程式助手 (Coding Assistant)

  • 交互方式:对话式交互,需要你主动提问
  • 使用场景:代码解释、问题诊断、学习指导
  • 控制程度:你完全控制,AI 提供建议

AI 代理 (Coding Agent)

  • 交互方式:自动化执行,可以独立完成任务
  • 使用场景:代码生成、重构、测试编写
  • 控制程度:AI 可以自主执行,你负责审查

3. Cursor 快捷键

AI 相关快捷键

快捷键 功能 说明
Cmd/Ctrl + K AI 对话 打开 AI 聊天窗口
Cmd/Ctrl + Shift + A AI 解释代码 选中代码后解释
Cmd/Ctrl + Shift + R AI 重构代码 选中代码后重构
Cmd/Ctrl + Shift + T AI 生成测试 为选中代码生成测试

4. 如何搭配多模态 (multi-modal) 完成任务

多模态功能

  • 图像识别:上传截图,AI 可以理解并生成代码
  • 文件上传:上传文档,AI 理解后生成代码

实用场景

# 场景1:从设计图生成代码
1. 截图上传到 Cursor
2. 描述:"根据这个设计图生成 React 组件"
3. AI 分析图片并生成对应代码

# 场景2:从错误截图诊断问题
1. 上传错误截图
2. 描述:"这个错误是什么原因?如何解决?"
3. AI 分析错误信息并提供解决方案

# 场景3:从文档生成代码
1. 上传 API 文档
2. 描述:"根据这个 API 文档生成调用代码"
3. AI 理解文档并生成示例代码

如何有效获得更高品质的回复

1. 提示词是什么?如何透过 ./cursor/rules 设置提示词?

提示词的重要性

提示词是与 AI 沟通的桥梁,好的提示词能够:

  • 获得更准确的代码生成
  • 减少迭代次数
  • 提高工作效率

项目级提示词设置

在项目根目录创建 .cursorrules 文件:

Java/Spring Boot 项目配置示例:

{
"rules": [
"使用 Java 17 或更高版本",
"遵循 Spring Boot 最佳实践",
"使用 Lombok 减少样板代码",
"编写单元测试覆盖核心功能",
"使用 JavaDoc 注释",
"遵循 SOLID 原则",
"使用 Optional 避免空指针异常",
"添加适当的异常处理",
"使用 Spring Security 进行安全控制",
"遵循 RESTful API 设计规范"
],
"context": "这是一个 Spring Boot 项目,使用 Maven 构建工具,集成 MySQL 数据库和 Redis 缓存",
"style": "使用现代 Java 语法,优先使用 Stream API,避免使用传统 for 循环"
}

个人级提示词设置

在 Cursor 设置中配置个人偏好:

Java 开发者配置示例:

{
"cursor.rules": [
"我是一个有 5 年经验的 Java 开发者",
"我专注于 Spring Boot 和微服务架构",
"我喜欢使用 Lombok 和 MapStruct 减少样板代码",
"我倾向于使用 JUnit 5 和 Mockito 进行测试",
"我重视代码质量和设计模式的应用",
"我熟悉 DDD (领域驱动设计) 和 CQRS 模式"
]
}

2. 提示词基础:传统模型 vs. 思考模型,什么时候选哪一个?

传统模型 (Traditional Model)

  • 特点:直接生成答案,速度快
  • 适用场景
    • 简单的代码补全
    • 基础的语法问题
    • 快速原型开发
  • 示例
    "生成一个计算数组总和的函数"

思考模型 (Thinking Model)

  • 特点:先思考再回答,质量高
  • 适用场景
    • 复杂的架构设计
    • 性能优化问题
    • 代码重构
    • 学习新概念
  • 示例
    "请先分析这个函数的性能瓶颈,然后提供优化方案"

选择策略

  • 简单任务:使用传统模型,快速获得结果
  • 复杂任务:使用思考模型,确保质量
  • 学习场景:优先使用思考模型,理解原理

3. 给 AI 代理的提示词该如何调整?

AI 代理提示词特点

  • 需要明确的指令:告诉 AI 具体要做什么
  • 提供上下文:让 AI 理解项目背景
  • 设定约束:明确代码风格和规范

好的 AI 代理提示词示例

# 生成服务类 (Java/Spring Boot)
"请生成一个 Spring Boot 用户服务类,要求:
1. 使用 Java 17 语法
2. 实现 CRUD 操作
3. 添加参数验证
4. 使用 Lombok 注解
5. 包含异常处理
6. 添加 Swagger 文档注解"

# 重构代码 (Java)
"请重构这个 Java 方法,要求:
1. 提高性能,使用 Stream API
2. 添加异常处理
3. 使用 Optional 避免空指针
4. 添加 JavaDoc 注释
5. 遵循 SOLID 原则"

# 生成测试 (Java)
"请为这个 Java 类生成完整的单元测试,要求:
1. 使用 JUnit 5 和 Mockito
2. 覆盖所有方法分支
3. 包含边界条件测试
4. 模拟外部依赖
5. 测试异常情况"

提示工程

提示工程(Prompt Engineering)是一门较新的学科,关注提示词开发和优化,帮助用户将大语言模型(Large Language Model, LLM)用于各场景和研究领域。

提示工程不仅仅是关于设计和研发提示词。它包含了与大语言模型交互和研发的各种技能和技术。提示工程在实现和大语言模型交互、对接,以及理解大语言模型能力方面都起着重要作用。用户可以通过提示工程来提高大语言模型的安全性,也可以赋能大语言模型,比如借助专业领域知识和外部工具来增强大语言模型能力。详细介绍见提示工程

4.善用上下文

什么是上下文?

上下文是指 AI 理解你的代码和需求所需的背景信息,包括:

  • 项目结构
  • 代码风格
  • 技术栈
  • 业务逻辑
  • 依赖关系

上下文的重要性

  • 提高准确性:AI 能生成更符合项目风格的代码
  • 减少迭代:一次生成就能满足需求
  • 保持一致性:生成的代码与现有代码风格一致

如何提供上下文

# 方法1:使用 @File 引用文件
"请参考 @File:src/components/UserCard.tsx 的风格,生成一个类似的 ProductCard 组件"

# 方法2:使用 @Code 引用代码片段
"请根据 @Code:src/utils/api.ts 中的 API 调用模式,生成用户管理相关的 API 函数"

# 方法3:使用 @Git 引用 Git 历史
"请查看 @Git:最近3次提交,了解我们的代码风格,然后重构这个函数"

5. 如何在 Cursor 中提供脉络 (上下文) @File、@Code、@Git 介绍

@File 指令

  • 功能:引用整个文件作为上下文
  • 语法@File:文件路径
  • 示例
    "请参考 @File:src/components/Button.tsx 的样式,生成一个类似的 Link 组件"

@Code 指令

  • 功能:引用代码片段作为上下文
  • 语法@Code:文件路径:行号范围
  • 示例
    "请根据 @Code:src/utils/validation.ts:10-25 的验证逻辑,为这个表单添加验证"

@Git 指令

  • 功能:引用 Git 历史作为上下文
  • 语法@Git:提交范围或分支
  • 示例
    "请查看 @Git:main 分支的代码风格,然后优化这个函数"

实际应用示例

# 场景1:保持组件风格一致
"请参考 @File:src/components/Card.tsx 的设计模式,生成一个 Modal 组件"

# 场景2:遵循 API 调用模式
"请根据 @Code:src/services/auth.ts:15-30 的 API 调用方式,生成用户管理相关的服务函数"

# 场景3:了解项目历史
"请查看 @Git:最近5次提交,了解我们的重构方向,然后优化这个组件"

# 场景4:Java 项目上下文
"请参考 @File:src/main/java/com/example/service/UserService.java 的实现模式,生成一个类似的 ProductService"

6. 避免 AI 失忆问题

AI 失忆问题

  • 现象:AI 在长对话中忘记之前的上下文
  • 原因:上下文窗口限制,信息过多导致遗忘
  • 影响:需要重复解释,降低效率

决策上下文策略

# 策略1:建立决策记录
"请记住我们的决策:
1. 使用 TypeScript 进行类型安全
2. 优先使用函数式组件
3. 使用 Tailwind CSS 进行样式设计
4. 遵循 ESLint 规则"

# 策略2:分步骤执行
"第一步:分析现有代码结构
第二步:设计新的组件架构
第三步:生成具体实现代码"

# 策略3:使用外部文档
"请参考项目根目录的 README.md 和 CONTRIBUTING.md 文件,了解我们的开发规范"

避免失忆的最佳实践

  1. 保持对话简洁:每次只讨论一个主题
  2. 使用项目配置:通过 .cursorrules 文件设置全局规则
  3. 建立决策文档:将重要决策记录在文档中
  4. 分阶段执行:将复杂任务分解为多个简单步骤

7. 透过单一脉络原则,确保高品质的回复

单一脉络原则

  • 核心思想:每次对话只关注一个明确的
  • 优势:提高 AI 理解准确性,减少混淆
  • 应用:避免在同一个对话中混合多个不相关的主题

实施方法

# 好的做法:专注单一脉络
"请专注于用户认证功能,生成登录、注册、密码重置的完整实现"

# 不好的做法:混合多个脉络
"请生成用户认证功能,同时优化性能,还要考虑国际化,并且添加测试"

脉络切换策略

# 当需要切换脉络时,明确告知 AI
"现在让我们切换到性能优化脉络。请分析这个组件的渲染性能,并提供优化建议"

# 或者开始新的对话
"让我们开始一个新的对话,专门讨论数据库设计"

实战运用

1. 软体开发不只是写代码

完整的开发流程

  1. 需求分析:理解业务需求
  2. 系统设计:架构设计和技术选型
  3. 代码实现:编写代码
  4. 测试验证:单元测试、集成测试
  5. 部署上线:CI/CD 流程
  6. 维护优化:监控、优化、重构

Cursor 在各阶段的应用

# 需求分析阶段
"请帮我分析这个用户故事,识别技术需求和实现难点"

# 系统设计阶段
"请根据需求设计系统架构,考虑可扩展性和性能"

# 代码实现阶段
"请生成符合设计规范的代码实现"

# 测试验证阶段
"请为这个功能生成完整的测试用例"

# 部署上线阶段
"请生成 Docker 配置和 CI/CD 脚本"

# 维护优化阶段
"请分析这个性能问题,提供优化方案"

2. 透过 Cursor 协助写出更好的设计文件

设计文档类型

  • 技术设计文档:系统架构、API 设计
  • 用户故事:功能需求描述
  • API 文档:接口规范
  • 数据库设计:表结构设计

使用 Cursor 生成设计文档

# 生成技术设计文档
"请为这个用户管理系统生成技术设计文档,包括:
1. 系统架构图
2. 数据库设计
3. API 接口设计
4. 安全考虑
5. 性能优化策略"

# 生成用户故事
"请将这个功能需求转换为用户故事格式:
作为[用户角色]
我希望[功能描述]
以便[业务价值]"

# 生成 API 文档
"请为这个 API 生成完整的文档,包括:
1. 请求参数
2. 响应格式
3. 错误码
4. 使用示例"

设计文档模板

# 功能设计文档

## 1. 概述
- 功能名称:
- 业务价值:
- 技术栈:

## 2. 系统架构
- 前端组件:
- 后端 API:
- 数据库设计:

## 3. 实现细节
- 核心逻辑:
- 错误处理:
- 性能考虑:

## 4. 测试策略
- 单元测试:
- 集成测试:
- 端到端测试:

## 5. 部署计划
- 环境配置:
- 部署步骤:
- 监控指标:

3. 透过 Cursor 快速上手代码库

代码库分析策略

# 第一步:了解项目结构
"请分析这个项目的目录结构,解释各个文件夹的作用"

# 第二步:理解核心模块
"请解释这个项目的核心模块是如何工作的"

# 第三步:分析数据流
"请分析数据在这个项目中是如何流动的"

# 第四步:理解配置
"请解释这个项目的配置文件,以及如何修改它们"

快速上手指南

# 生成项目概览
"请为这个项目生成一个快速上手指南,包括:
1. 项目简介
2. 技术栈说明
3. 安装步骤
4. 开发环境配置
5. 常见问题解决"

# 生成架构图
"请分析这个项目的架构,生成一个架构图说明"

# 生成 API 文档
"请分析这个项目的 API,生成完整的 API 文档"

4. 用 Cursor 写代码与测试

代码编写最佳实践

# 生成完整功能 (JavaScript/React)
"请生成一个完整的用户管理功能,包括:
1. 用户模型定义
2. API 接口实现
3. 前端组件
4. 表单验证
5. 错误处理"

# 生成完整功能 (Java/Spring Boot)
"请生成一个完整的用户管理功能,包括:
1. User 实体类和 DTO
2. UserRepository 数据访问层
3. UserService 业务逻辑层
4. UserController REST API 控制器
5. 参数验证和异常处理
6. 单元测试和集成测试"

# 代码重构 (JavaScript)
"请重构这个函数,提高可读性和性能"

# 代码重构 (Java)
"请重构这个 Java 类,要求:
1. 使用 Stream API 优化集合操作
2. 使用 Optional 避免空指针异常
3. 提取公共方法减少重复代码
4. 添加适当的异常处理
5. 使用 Builder 模式优化对象创建"

# 添加新功能 (JavaScript/React)
"请在这个现有组件中添加新的功能特性"

# 添加新功能 (Java/Spring Boot)
"请在这个现有的 UserService 中添加用户搜索功能,支持按姓名、邮箱模糊搜索,并实现分页"

测试编写策略

# 单元测试 (JavaScript)
"请为这个函数生成完整的单元测试"

# 单元测试 (Java)
"请为这个 Java 类生成完整的单元测试,使用 JUnit 5 和 Mockito"

# 集成测试 (JavaScript)
"请为这个 API 生成集成测试"

# 集成测试 (Java)
"请为这个 Spring Boot Controller 生成集成测试,使用 @SpringBootTest 和 TestRestTemplate"

# 端到端测试 (JavaScript)
"请为这个用户流程生成端到端测试"

# 端到端测试 (Java)
"请为这个用户注册登录流程生成端到端测试,使用 Selenium 或 Playwright"

# 测试数据 (JavaScript)
"请生成测试用的模拟数据"

# 测试数据 (Java)
"请生成测试用的模拟数据,包括 User 实体、DTO 和测试用例数据"

测试示例

// JavaScript 单元测试示例
describe('UserService', () => {
describe('createUser', () => {
it('should create a new user successfully', async () => {
const userData = {
name: 'John Doe',
email: 'john@example.com',
password: 'password123'
};

const result = await UserService.createUser(userData);

expect(result).toHaveProperty('id');
expect(result.name).toBe(userData.name);
expect(result.email).toBe(userData.email);
});

it('should throw error for invalid email', async () => {
const userData = {
name: 'John Doe',
email: 'invalid-email',
password: 'password123'
};

await expect(UserService.createUser(userData))
.rejects.toThrow('Invalid email format');
});
});
});
// Java 单元测试示例
@ExtendWith(MockitoExtension.class)
class UserServiceTest {

@Mock
private UserRepository userRepository;

@Mock
private PasswordEncoder passwordEncoder;

@InjectMocks
private UserService userService;

@Test
@DisplayName("应该成功创建新用户")
void shouldCreateNewUserSuccessfully() {
// Given
CreateUserRequest request = CreateUserRequest.builder()
.name("John Doe")
.email("john@example.com")
.password("password123")
.build();

User savedUser = User.builder()
.id(1L)
.name("John Doe")
.email("john@example.com")
.build();

when(passwordEncoder.encode("password123")).thenReturn("encodedPassword");
when(userRepository.save(any(User.class))).thenReturn(savedUser);

// When
User result = userService.createUser(request);

// Then
assertThat(result).isNotNull();
assertThat(result.getId()).isEqualTo(1L);
assertThat(result.getName()).isEqualTo("John Doe");
assertThat(result.getEmail()).isEqualTo("john@example.com");

verify(userRepository).save(any(User.class));
verify(passwordEncoder).encode("password123");
}

@Test
@DisplayName("应该抛出异常当邮箱格式无效时")
void shouldThrowExceptionWhenEmailIsInvalid() {
// Given
CreateUserRequest request = CreateUserRequest.builder()
.name("John Doe")
.email("invalid-email")
.password("password123")
.build();

// When & Then
assertThatThrownBy(() -> userService.createUser(request))
.isInstanceOf(InvalidEmailException.class)
.hasMessage("Invalid email format: invalid-email");
}
}

5. 透过 Cursor 协助生成 Commit 讯息

Commit 信息规范

# 使用 AI 生成规范的 commit 信息
"请为这次更改生成符合 Conventional Commits 规范的 commit 信息"

# 分析更改内容
"请分析这次更改的内容,生成详细的 commit 信息"

Commit 类型

# feat: 新功能
"feat: add user authentication with JWT tokens"

# fix: 修复 bug
"fix: resolve memory leak in data processing"

# docs: 文档更新
"docs: update API documentation with examples"

# style: 代码格式
"style: format code according to ESLint rules"

# refactor: 重构
"refactor: extract common validation logic"

# test: 测试
"test: add unit tests for user service"

# chore: 构建过程或辅助工具的变动
"chore: update dependencies to latest versions"

详细 Commit 信息示例

feat: add user authentication with JWT tokens

- Implement JWT token generation and validation
- Add login/logout endpoints
- Include user role-based access control
- Add comprehensive error handling
- Update API documentation

Closes #123

6. 透过 Cursor 协助生成 PR 描述

PR 描述模板

# 使用 AI 生成 PR 描述
"请为这个 PR 生成详细的描述,包括:
1. 功能概述
2. 技术实现
3. 测试覆盖
4. 影响范围
5. 部署注意事项"

PR 描述示例

## 功能概述
添加用户认证功能,支持 JWT token 登录和角色权限控制。

## 技术实现
- 使用 JWT 进行身份验证
- 实现基于角色的访问控制 (RBAC)
- 添加密码加密和验证
- 集成 Redis 进行 token 缓存

## 测试覆盖
- ✅ 单元测试:用户服务、认证服务
- ✅ 集成测试:登录、注册、权限验证
- ✅ 端到端测试:完整用户流程

## 影响范围
- 新增用户认证相关 API
- 修改前端路由配置
- 更新数据库 schema

## 部署注意事项
- 需要配置 JWT_SECRET 环境变量
- 需要启动 Redis 服务
- 需要运行数据库迁移脚本

7. 透过 Cursor 协助 Code Review

Code Review 策略

# 全面代码审查
"请对这个 PR 进行全面的代码审查,包括:
1. 代码质量
2. 性能问题
3. 安全风险
4. 最佳实践
5. 可维护性"

# 特定方面审查
"请重点审查这个 PR 的安全性和性能问题"

# 架构审查
"请从架构角度审查这个设计是否合理"

Code Review 检查清单

# 代码质量
- [ ] 代码可读性
- [ ] 命名规范
- [ ] 函数复杂度
- [ ] 错误处理

# 性能
- [ ] 算法复杂度
- [ ] 内存使用
- [ ] 数据库查询优化
- [ ] 缓存策略

# 安全
- [ ] 输入验证
- [ ] SQL 注入防护
- [ ] XSS 防护
- [ ] 权限控制

# 测试
- [ ] 测试覆盖率
- [ ] 测试质量
- [ ] 边界条件测试
- [ ] 错误场景测试

Code Review 反馈示例

## 代码质量 ✅
整体代码质量良好,结构清晰。

## 性能问题 ⚠️
-`getUserList` 函数中,建议添加分页参数避免大量数据查询
- 考虑在频繁调用的地方添加缓存

## 安全风险 ❌
- 密码验证逻辑需要加强,建议使用 bcrypt
- API 缺少速率限制,可能被暴力攻击

## 建议改进
1. 添加输入验证中间件
2. 实现请求速率限制
3. 优化数据库查询性能
4. 添加更详细的错误日志

MCP 入门与应用

1. 透过回顾 AI 代理谈 MCP

AI 代理的局限性

  • 上下文限制:无法访问外部系统和数据
  • 功能受限:只能基于训练数据进行推理
  • 实时性差:无法获取最新信息
  • 集成困难:难以与现有系统集成

MCP 的解决方案

  • 扩展能力:通过插件扩展 AI 功能
  • 实时访问:可以访问外部 API 和数据库
  • 系统集成:与现有开发工具无缝集成
  • 定制化:根据团队需求定制功能

2. MCP 是什么?在解决什么问题?

MCP 定义

MCP (Model Context Protocol) 是一个开放协议,允许 AI 模型与外部工具和服务进行安全、结构化的交互。

解决的问题

  1. 信息孤岛:连接分散的数据源和工具
  2. 功能限制:扩展 AI 的能力边界
  3. 集成困难:简化 AI 与现有系统的集成
  4. 安全性:提供安全的工具访问机制

MCP 架构

# MCP 组件
AI 模型 ↔ MCP 协议 ↔ MCP 服务器 ↔ 外部工具/服务

# 工作流程
1. AI 模型发送请求到 MCP 服务器
2. MCP 服务器调用相应的外部工具
3. 外部工具返回结果
4. MCP 服务器将结果返回给 AI 模型

3. 如何在 Cursor 中使用 MCP?

启用 MCP 功能

# 在 Cursor 设置中启用 MCP
1. 打开 Cursor 设置
2. 搜索 "MCP"
3. 启用 MCP 功能
4. 配置 MCP 服务器

配置 MCP 服务器

// 在 Cursor 配置文件中添加 MCP 设置
{
"mcp.servers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_TOKEN": "your-github-token"
}
},
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem"],
"env": {
"MCP_FILESYSTEM_ROOT": "/path/to/your/project"
}
}
}
}

使用 MCP 功能

# 使用 GitHub MCP 查询仓库信息
"请查询这个 GitHub 仓库的最新提交和问题状态"

# 使用文件系统 MCP 分析项目结构
"请分析这个项目的文件结构,找出所有 TypeScript 文件"

# 使用数据库 MCP 查询数据
"请查询用户表中的活跃用户数量"

4. 如何透过 MCP 提高开发生产力?

常用 MCP 服务器

# GitHub MCP
- 查询仓库信息
- 创建和管理 Issues
- 查看 Pull Requests
- 分析代码贡献

# 文件系统 MCP
- 分析项目结构
- 搜索文件内容
- 批量文件操作
- 代码统计

# 数据库 MCP
- 查询数据
- 分析数据模式
- 生成数据报告
- 数据迁移

# API MCP
- 调用外部 API
- 测试 API 接口
- 生成 API 文档
- 监控 API 状态

生产力提升场景

# 场景1:自动化代码审查
"请使用 GitHub MCP 获取最近的 PR,然后进行代码审查"

# 场景2:项目分析
"请使用文件系统 MCP 分析这个项目的代码质量,生成报告"

# 场景3:数据驱动开发
"请使用数据库 MCP 查询用户行为数据,为功能优化提供建议"

# 场景4:API 集成
"请使用 API MCP 测试这个新接口,验证功能是否正常"

6. 如何开发 MCP 服务器?

依赖配置

<!-- Spring Boot 3.x 基础依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

<!-- Spring AI 核心依赖,支持 @Tool 注解 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-core</artifactId>
<version>0.8.0</version>
</dependency>

<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-server-webmvc-spring-boot-starter</artifactId>
</dependency>

<!-- Spring AI OpenAI 支持(如用 OpenAI LLM) -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>0.8.0</version>
</dependency>

Spring AI 支持用 @Tool 注解方式暴露业务接口逻辑,极简集成 LLM Function Calling,适合企业级 MCP 服务器开发。

1. Tool 定义

import org.springframework.ai.function.annotation.Tool;
import org.springframework.stereotype.Service;

@Service
public class WeatherService {
@Tool(description = "Get weather information by city name")
public String getWeather(String cityName) {
// 实际可接第三方API或数据库
return cityName + ":晴,25°C";
}
}

2. MCP Server 启动类

import org.springframework.ai.function.MethodToolCallbackProvider;
import org.springframework.ai.function.ToolCallbackProvider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class McpServerApplication {
private static final Logger logger = LoggerFactory.getLogger(McpServerApplication.class);
public static void main(String[] args) {
SpringApplication.run(McpServerApplication.class, args);
}
@Bean
public ToolCallbackProvider weatherTools(WeatherService weatherService) {
// 自动注册所有 @Tool 注解方法
return MethodToolCallbackProvider.builder()
.toolObjects(weatherService)
.build();
}
}

3. 配置(application.yml)

# Using spring-ai-mcp-server-webmvc-spring-boot-starter
spring:
ai:
mcp:
server:
name: webmvc-mcp-server
version: 1.0.0
type: SYNC
sse-message-endpoint: /mcp/messages

Java 开发示例

1. 使用 Cursor 进行代码重构

// 原始代码(需要重构)
public List<User> getActiveUsers() {
List<User> allUsers = userRepository.findAll();
List<User> activeUsers = new ArrayList<>();
for (User user : allUsers) {
if (user.getStatus() == UserStatus.ACTIVE) {
activeUsers.add(user);
}
}
return activeUsers;
}

// 使用 Cursor 重构后的代码
// Cmd/Ctrl + K → "请重构这个方法,使用 Stream API 和 Optional"

public List<User> getActiveUsers() {
return userRepository.findAll().stream()
.filter(user -> UserStatus.ACTIVE.equals(user.getStatus()))
.collect(Collectors.toList());
}

// 或者更优化的版本
public List<User> getActiveUsers() {
return userRepository.findByStatus(UserStatus.ACTIVE);
}

2. 异常处理优化

// 使用 Cursor 生成全局异常处理器
// Cmd/Ctrl + K → "请生成一个全局异常处理器,处理常见的 Spring Boot 异常"

@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ApiResponse<Void>> handleValidationException(
MethodArgumentNotValidException ex) {
log.warn("Validation error: {}", ex.getMessage());

List<String> errors = ex.getBindingResult()
.getFieldErrors()
.stream()
.map(FieldError::getDefaultMessage)
.collect(Collectors.toList());

ApiResponse<Void> response = ApiResponse.<Void>builder()
.success(false)
.message("Validation failed")
.errors(errors)
.build();

return ResponseEntity.badRequest().body(response);
}

@ExceptionHandler(DataIntegrityViolationException.class)
public ResponseEntity<ApiResponse<Void>> handleDataIntegrityViolation(
DataIntegrityViolationException ex) {
log.error("Data integrity violation: {}", ex.getMessage());

ApiResponse<Void> response = ApiResponse.<Void>builder()
.success(false)
.message("Data integrity violation occurred")
.build();

return ResponseEntity.status(HttpStatus.CONFLICT).body(response);
}

@ExceptionHandler(Exception.class)
public ResponseEntity<ApiResponse<Void>> handleGenericException(Exception ex) {
log.error("Unexpected error: {}", ex.getMessage(), ex);

ApiResponse<Void> response = ApiResponse.<Void>builder()
.success(false)
.message("An unexpected error occurred")
.build();

return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
}
}

总结

Cursor 作为新一代 AI 编程助手,通过合理使用其 AI 功能和 MCP 扩展,可以显著提升开发效率。本教程涵盖了从基础使用到高级应用的完整内容,帮助开发者充分利用 Cursor 的潜力。

关键要点

  1. 掌握基础:熟悉 Cursor 的核心功能和快捷键
  2. 优化提示词:学会编写有效的提示词和提供上下文
  3. 实战应用:在完整的开发流程中应用 Cursor
  4. 扩展能力:通过 MCP 扩展 Cursor 的功能边界

相关资源:

标签: #Cursor #AI编程 #开发工具 #编程效率 #MCP #AI代理