大家好,我是你们的 Java 老司机!今天咱们玩点高级的——用 Spring AI 实现 MCP(Mean Code Patrol,代码平均巡逻员),让 AI 自动检查代码质量、优化性能,甚至帮你写单元测试!
MCP 是什么?
- 代码风格检查(比如命名不规范、魔法数字)性能优化建议(比如
String
拼接改用 StringBuilder
)自动生成单元测试(再也不用自己写 @Test
了)安全漏洞扫描(防止 SQL 注入、XSS 等)技术栈:
- Spring AI(调用 DeepSeek/GPT 分析代码)Spring Boot(提供 REST API)GitHub API(可选,实现 CI/CD 集成)
1. 项目初始化(SpringBoot + Spring AI)
(1) 创建项目
用 Spring Initializr 生成项目,选择:
- Spring Boot 3.2+Spring AI(集成 DeepSeek)
pom.xml 关键依赖:
<dependencies> <!-- SpringBoot Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Spring AI (DeepSeek) --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-deepseek</artifactId> <version>0.8.0</version> </dependency> <!-- 代码解析(可选) --> <dependency> <groupId>org.eclipse.jdt</groupId> <artifactId>org.eclipse.jdt.core</artifactId> <version>3.30.0</version> <!-- 用于解析 Java 代码 --> </dependency></dependencies>
(2) 配置 DeepSeek
在 application.yml
中:
spring: ai: deepseek: api-key: "你的-DeepSeek-API-KEY" chat: model: deepseek-chat temperature: 0.3 # 保守模式,减少 AI 瞎编
2. 核心功能实现
(1) 代码分析服务
创建一个 CodeAnalysisService
,让 AI 检查代码质量:
import org.springframework.ai.chat.ChatClient;import org.springframework.stereotype.Service;@Servicepublic class CodeAnalysisService { private final ChatClient chatClient; public CodeAnalysisService(ChatClient chatClient) { this.chatClient = chatClient; } public String analyzeCode(String code) { String prompt = """ 请分析以下 Java 代码的质量,并给出改进建议: 要求: 1. 检查代码风格(命名、注释、魔法数字等) 2. 检查性能问题(如字符串拼接、循环优化等) 3. 检查潜在的安全风险(如 SQL 注入、XSS) 4. 用 Markdown 格式返回结果 代码: ```java %s ``` """.formatted(code); return chatClient.call(prompt); }}
测试:
String badCode = """ public class BadCode { public String getUser(int id) { String sql = "SELECT * FROM user WHERE id = " + id; // SQL 注入风险! return jdbcTemplate.query(sql); } } """;String review = codeAnalysisService.analyzeCode(badCode);System.out.println(review);
AI 返回示例:
### 代码质量分析报告1. **安全问题** - 🚨 SQL 注入风险:直接拼接 SQL 查询,应改用 `PreparedStatement` 2. **代码风格** - 方法名 `getUser` 符合规范,但缺少注释 3. **性能优化** - 无显著性能问题
(2) 自动生成单元测试
让 AI 帮你写 JUnit 测试:
public String generateUnitTest(String code) { String prompt = """ 请为以下 Java 代码生成 JUnit 5 单元测试: 要求: 1. 使用 Mockito 模拟依赖 2. 覆盖主要逻辑分支 3. 包含断言 代码: ```java %s ``` """.formatted(code); return chatClient.call(prompt);}
输入:
public class Calculator { public int add(int a, int b) { return a + b; }}
AI 生成结果:
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.*;class CalculatorTest { @Test void testAdd() { Calculator calc = new Calculator(); assertEquals(3, calc.add(1, 2)); assertEquals(-1, calc.add(1, -2)); }}
(3) 集成 GitHub(可选)
通过 GitHub Webhook 实现 PR 自动审查:
@RestController@RequestMapping("/github")public class GitHubController { @PostMapping("/webhook") public void handlePR(@RequestBody GitHubPullRequestEvent event) { String diffUrl = event.getPullRequest().getDiffUrl(); String diff = fetchDiff(diffUrl); // 获取代码变更 String review = codeAnalysisService.analyzeCode(diff); postComment(event.getPullRequest().getCommentsUrl(), review); // 提交审查意见 }}
3. 前端展示(简易版)
用 Thymeleaf 做个简单界面:
@Controllerpublic class MCPController { @GetMapping("/") public String index() { return "index"; } @PostMapping("/analyze") public String analyze(@RequestParam String code, Model model) { model.addAttribute("report", codeAnalysisService.analyzeCode(code)); return "result"; }}
index.html
(表单提交代码):
<form action="/analyze" method="post"> <textarea name="code" rows="10" cols="80"></textarea> <button type="submit">分析代码</button></form>
result.html
(展示 AI 报告):
<div th:utext="${report}"></div> <!-- 渲染 Markdown -->
4. 部署与优化
(1) 缓存优化
避免重复分析相同代码:
@Cacheable("codeReviews")public String analyzeCode(String code) { ... }
(2) 限流保护
防止 API 被刷爆:
@RateLimiter(value = 10, timeUnit = TimeUnit.SECONDS) // 10 秒内限流public String analyzeCode(String code) { ... }
(3) 异步处理
长时间任务改用异步:
@Asyncpublic CompletableFuture<String> analyzeLargeCode(String code) { ... }
5. 总结
实现的功能:
✅ 代码质量分析(风格、性能、安全)
✅ 自动生成单元测试
✅ GitHub 集成(PR 自动审查)
扩展方向:
- IDE 插件(实时提示代码问题)CI/CD 流水线(检查不通过则阻塞部署)自定义规则引擎(结合 Checkstyle/PMD)
最后提醒:
- AI 审查结果需人工复核,别让它乱改生产代码敏感代码勿上传,防止泄露商业逻辑如果 AI 吐槽你代码太烂…… 请冷静,它说的可能是真的