Spring AI 实现 MCP:让 AI 自动管理你的代码质量

大家好,我是你们的 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 关键依赖:

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 中:

yaml 复制代码
spring:
  ai:
    deepseek:
      api-key: "你的-DeepSeek-API-KEY"
      chat:
        model: deepseek-chat
        temperature: 0.3  # 保守模式,减少 AI 瞎编

2. 核心功能实现

(1) 代码分析服务

创建一个 CodeAnalysisService,让 AI 检查代码质量:

java 复制代码
import org.springframework.ai.chat.ChatClient;
import org.springframework.stereotype.Service;

@Service
public 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);
    }
}

测试:

java 复制代码
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 返回示例:

markdown 复制代码
### 代码质量分析报告
1. **安全问题**  
   - 🚨 SQL 注入风险:直接拼接 SQL 查询,应改用 `PreparedStatement`  
2. **代码风格**  
   - 方法名 `getUser` 符合规范,但缺少注释  
3. **性能优化**  
   - 无显著性能问题  

(2) 自动生成单元测试

让 AI 帮你写 JUnit 测试:

java 复制代码
public String generateUnitTest(String code) {
    String prompt = """
        请为以下 Java 代码生成 JUnit 5 单元测试:
        要求:
        1. 使用 Mockito 模拟依赖
        2. 覆盖主要逻辑分支
        3. 包含断言
        
        代码:
        ```java
        %s
        ```
        """.formatted(code);
    
    return chatClient.call(prompt);
}

输入:

java 复制代码
public class Calculator {
    public int add(int a, int b) { return a + b; }
}

AI 生成结果:

java 复制代码
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 自动审查:

java 复制代码
@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 做个简单界面:

java 复制代码
@Controller
public 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(表单提交代码):

html 复制代码
<form action="/analyze" method="post">
    <textarea name="code" rows="10" cols="80"></textarea>
    <button type="submit">分析代码</button>
</form>

result.html(展示 AI 报告):

html 复制代码
<div th:utext="${report}"></div>  <!-- 渲染 Markdown -->

4. 部署与优化

(1) 缓存优化

避免重复分析相同代码:

java 复制代码
@Cacheable("codeReviews")
public String analyzeCode(String code) { ... }

(2) 限流保护

防止 API 被刷爆:

java 复制代码
@RateLimiter(value = 10, timeUnit = TimeUnit.SECONDS) // 10 秒内限流
public String analyzeCode(String code) { ... }

(3) 异步处理

长时间任务改用异步:

java 复制代码
@Async
public CompletableFuture<String> analyzeLargeCode(String code) { ... }

5. 总结

实现的功能:

代码质量分析 (风格、性能、安全)

自动生成单元测试

GitHub 集成(PR 自动审查)

扩展方向:

  • IDE 插件(实时提示代码问题)
  • CI/CD 流水线(检查不通过则阻塞部署)
  • 自定义规则引擎(结合 Checkstyle/PMD)

最后提醒:

  • AI 审查结果需人工复核,别让它乱改生产代码
  • 敏感代码勿上传,防止泄露商业逻辑
  • 如果 AI 吐槽你代码太烂...... 请冷静,它说的可能是真的
相关推荐
fanged3 小时前
构建系统maven
java·maven
沙滩小岛小木屋3 小时前
maven编译时跳过test过程
java·maven
江沉晚呤时4 小时前
SQL Server 事务详解:概念、特性、隔离级别与实践
java·数据库·oracle·c#·.netcore
GoGeekBaird4 小时前
69天探索操作系统-第66天:为现代操作系统设计高级实时进程间通信机制
后端·操作系统
还是鼠鼠5 小时前
单元测试-概述&入门
java·开发语言·后端·单元测试·log4j·maven
我最厉害。,。7 小时前
接口安全&SOAP&OpenAPI&RESTful&分类特征导入&项目联动检测
后端·restful
MyikJ7 小时前
Java求职面试:从Spring到微服务的技术挑战
java·数据库·spring boot·spring cloud·微服务·orm·面试技巧
MyikJ7 小时前
Java 面试实录:从Spring到微服务的技术探讨
java·spring boot·微服务·kafka·spring security·grafana·prometheus
ShiinaMashirol8 小时前
代码随想录打卡|Day50 图论(拓扑排序精讲 、dijkstra(朴素版)精讲 )
java·图论
cui_hao_nan8 小时前
Nacos实战——动态 IP 黑名单过滤
java