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 吐槽你代码太烂...... 请冷静,它说的可能是真的
相关推荐
花心蝴蝶.5 分钟前
JVM 类加载
开发语言·jvm·后端
野犬寒鸦10 分钟前
今日面试之项目拷打:锁与事务的深度解析
java·服务器·数据库·后端
sunbin10 分钟前
软件授权管理系统-整体业务流程图
后端
ajassi200025 分钟前
开源 java android app 开发(十五)自定义绘图控件--仪表盘
android·java·开源
间彧28 分钟前
Java中,wait()和sleep()区别
后端
FrankYoou29 分钟前
Spring Boot 自动配置之 TaskExecutor
java·spring boot
爱读源码的大都督30 分钟前
Spring AI Alibaba JManus底层实现剖析
java·人工智能·后端
间彧34 分钟前
synchronized的wait/notify机制详解与实战应用
后端
间彧37 分钟前
ReentrantLock与ReadWriteLock在性能和使用场景上有什么区别?
java
Lbwnb丶39 分钟前
p6spy 打印完整sql
java·数据库·sql