掘金 人工智能 前天 16:03
Spring AI 实现 MCP:让 AI 自动管理你的代码质量
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文介绍了如何利用 Spring AI 和 DeepSeek/GPT 构建一个名为 MCP(Mean Code Patrol)的 Java 代码智能巡逻工具。该工具能够自动检查代码质量、提供性能优化建议、生成单元测试,甚至扫描安全漏洞。文章详细阐述了项目初始化、核心功能实现(代码分析、单元测试生成、GitHub 集成)、前端展示、部署与优化等关键步骤,并提供了代码示例。最后,作者还强调了 AI 审查结果需要人工复核,并提出了扩展方向。

💡 项目初始化阶段,通过 Spring Initializr 快速创建 Spring Boot 项目,并引入 Spring AI (DeepSeek) 和代码解析依赖。在 `application.yml` 中配置 DeepSeek API Key,设置 `temperature` 参数以控制 AI 的保守程度。

🛠️ 核心功能实现包括代码分析服务和单元测试生成。`CodeAnalysisService` 通过调用 DeepSeek/GPT 分析 Java 代码,检查代码风格、性能问题和潜在安全风险,并以 Markdown 格式返回结果。同时,可以生成 JUnit 5 单元测试,覆盖主要逻辑分支,并包含断言。

🔗 可选的 GitHub 集成功能通过 GitHub Webhook 实现 PR 自动审查。当有 Pull Request 触发时,获取代码变更,调用代码分析服务,并将审查意见提交到 PR 的评论区。

🖥️ 前端展示使用 Thymeleaf 构建简易界面,用户可以在页面上输入代码并提交,然后显示 AI 生成的代码分析报告。通过 `@Cacheable` 注解实现缓存优化,避免重复分析相同代码;通过 `@RateLimiter` 注解实现限流保护,防止 API 被刷爆;使用 `@Async` 实现异步处理,优化长时间任务。

⚠️ 总结部分强调了 AI 审查结果需人工复核,并提出了扩展方向,如 IDE 插件、CI/CD 流水线和自定义规则引擎。同时,提醒开发者注意保护敏感代码,防止泄露商业逻辑。

大家好,我是你们的 Java 老司机!今天咱们玩点高级的——用 Spring AI 实现 MCP(Mean Code Patrol,代码平均巡逻员),让 AI 自动检查代码质量、优化性能,甚至帮你写单元测试!

MCP 是什么?

技术栈:


1. 项目初始化(SpringBoot + Spring AI)

(1) 创建项目

Spring Initializr 生成项目,选择:

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 自动审查)

扩展方向:

最后提醒:

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Spring AI DeepSeek 代码质量 单元测试 GitHub 集成
相关文章