最近在帮学弟学妹们看毕设项目,发现一个挺普遍的现象:大家想法都很好,但一到动手实现,就容易陷入“需求变来变去”、“代码越写越乱”、“时间总是不够”的怪圈。尤其是用 Spring Boot 这种主流框架,虽然上手快,但想写出结构清晰、易于维护的代码,对很多同学来说还是挑战。

刚好我自己在之前的项目里深度体验了 GitHub Copilot 和通义灵码这类 AI 编程助手,感觉它们简直是“毕设加速器”。所以,我想结合一个典型的 Spring Boot 毕设项目(比如一个简单的“课程选课管理系统”),分享一下如何借助 AI 工具,高效、高质量地完成开发。这不是要替代我们思考,而是学会让 AI 成为得力的副驾驶。

图片

1. 毕设开发中的那些“坑”

在动手之前,我们先理清通常会遇到哪些问题,这样才知道 AI 工具能在哪里帮上忙。

  1. 需求模糊与频繁变更:导师的一句话可能就让整个模块推倒重来。手动调整所有关联代码非常耗时。
  2. 缺乏工程规范:项目结构随意,Controller 里塞满业务逻辑,实体类、DTO、VO 混用,导致后期修改变成“牵一发而动全身”。
  3. 重复造轮子:分页查询、参数校验、统一响应封装……每个模块都写一遍,不仅效率低,还容易不一致。
  4. 技术细节耗时:比如如何优雅地实现 JWT 认证、怎么处理 Excel 导出、事务边界怎么划。查资料、调试会占用大量时间。
  5. 代码质量与安全:对 SQL 注入、XSS 攻击、接口幂等性等概念有意识,但实现时容易遗漏,埋下隐患。

2. AI 编程助手:选对工具,事半功倍

目前主流的 AI 编程助手主要有两类:IDE 插件Web 平台。对于 Spring Boot 毕设,我更推荐使用 IDE 插件,因为它们能深度结合你的项目上下文。

  • GitHub Copilot:老牌选手,代码补全和生成能力非常强,尤其擅长根据注释生成代码片段。它对 Java 和 Spring 生态的支持很好。缺点是收费,但学生可以通过 GitHub Education 包免费使用。
  • 通义灵码(阿里云):后起之秀,免费且对中文注释的理解更友好。除了代码补全,它的“解释代码”、“生成单元测试”、“代码优化建议”功能在理解复杂逻辑和保证质量上很有用。
  • Codeium / Tabnine:也有不错的免费额度,可以作为备选。

怎么选? 如果你是学生,追求免费和中文友好,通义灵码是首选。如果你有教育优惠,想体验最流畅的代码生成,Copilot 很棒。建议都安装试试,感受一下差异。

3. 实战:让 AI 帮我们构建核心模块

我们以“课程选课管理系统”中的两个核心功能为例,看看 AI 如何辅助。

场景一:快速生成符合规范的 RESTful API Controller

假设我们需要一个 CourseController,包含课程的分页查询、新增、更新、删除接口。

  • 传统做法:手动创建类,写 @RestController@RequestMapping,然后一个个敲方法,定义参数、注解、调用 Service,最后再写 Swagger 注解。

  • AI 辅助做法

    1. controller 包下新建 CourseController.java 文件。
    2. 输入以下注释作为 Prompt:
    // CourseController: 课程管理控制器
    // 需要实现以下RESTful接口:
    // 1. GET /api/courses?page=1&size=10&name=xxx 分页查询课程列表,支持按课程名模糊查询
    // 2. GET /api/courses/{id} 根据ID获取课程详情
    // 3. POST /api/courses 创建新课程,请求体为CourseDTO
    // 4. PUT /api/courses/{id} 更新课程信息
    // 5. DELETE /api/courses/{id} 删除课程(逻辑删除,更新deleted字段为1)
    // 使用@RestController, @RequestMapping("/api/courses")
    // 注入CourseService,方法名参考:getCourses, getCourseById, createCourse, updateCourse, deleteCourse
    // 使用Spring Data JPA的Pageable接收分页参数
    // 使用@Validated进行参数校验
    // 返回统一的Result响应对象(假设已定义)
    
    1. 然后,AI(如 Copilot 或通义灵码)通常会为你生成一个结构清晰、注解完整的 Controller 骨架。你只需要微调方法名、参数名,并确保 CourseServiceResult 类存在即可。

场景二:生成包含业务逻辑的 Service 实现

Controller 有了,我们需要实现 CourseServiceCourseServiceImpl

  1. service 包下创建接口 CourseService.java,定义上述 Controller 需要的方法。

  2. service/impl 包下创建 CourseServiceImpl.java。输入类注解 @Service@Slf4j(如果需要日志),然后开始写一个方法。例如,先写 createCourse 方法。

    @Override
    public Result<CourseVO> createCourse(CourseDTO courseDTO) {
        // 在这里,我们可以直接开始写业务逻辑注释,让AI填充
        // 1. 参数校验(DTO内的注解已校验,这里可做业务校验,如课程编号是否重复)
        // 2. DTO 转 Entity
        // 3. 保存到数据库
        // 4.  Entity 转 VO
        // 5. 返回成功结果
    }
    

    当你输入到 // 1. 参数校验... 时,AI 很可能会自动补全后续的代码块。或者,你可以在方法体内直接写:

    // 检查课程编号是否已存在
    if (courseRepository.existsByCourseCode(courseDTO.getCourseCode())) {
        throw new BusinessException(ErrorCode.COURSE_CODE_EXISTS);
    }
    

    写完这行,AI 可能会自动帮你补全 BusinessExceptionErrorCode 的引入,甚至继续生成后续的转换和保存代码。

一个更完整的、由 AI 辅助生成并经过人工优化的 Service 方法示例:

/**
 * 创建课程
 * @param courseDTO 课程数据传输对象
 * @return 创建成功的课程视图对象
 */
@Override
@Transactional(rollbackFor = Exception.class) // 添加事务管理
public CourseVO createCourse(@Valid CourseDTO courseDTO) {
    log.info("开始创建课程,课程编号:{}", courseDTO.getCourseCode());

    // 1. 业务逻辑校验:课程编号唯一性
    boolean exists = courseRepository.existsByCourseCode(courseDTO.getCourseCode());
    if (exists) {
        log.warn("课程编号已存在:{}", courseDTO.getCourseCode());
        throw new BusinessException(ErrorCode.COURSE_CODE_EXISTS, "课程编号已存在");
    }

    // 2. DTO 转 Entity (使用 MapStruct 或手动映射,此处为手动示例)
    Course course = new Course();
    BeanUtils.copyProperties(courseDTO, course); // 简单属性拷贝
    // 处理特殊字段,如状态默认为启用
    course.setStatus(1);
    course.setDeleted(0);
    course.setCreateTime(LocalDateTime.now());
    course.setUpdateTime(LocalDateTime.now());

    // 3. 持久化到数据库
    Course savedCourse = courseRepository.save(course);
    log.info("课程创建成功,ID:{}", savedCourse.getId());

    // 4. Entity 转 VO
    CourseVO courseVO = new CourseVO();
    BeanUtils.copyProperties(savedCourse, courseVO);
    // 可在此处填充关联信息,如教师姓名等
    // courseVO.setTeacherName(...);

    return courseVO;
}

关键点:AI 帮助快速生成了骨架和基础代码(如校验、保存、拷贝),但我们人工加入了事务注解 @Transactional详细的日志记录更友好的异常信息,并明确了字段的默认值设置。这就是“人机协作”的完美体现。

4. 警惕:AI 生成代码的潜在风险

AI 很强大,但它不是银弹,生成的代码可能隐藏风险,我们必须人工审查。

  1. 幂等性(Idempotence):对于 POST 请求,AI 生成的简单 save 操作不具备防重复提交能力。在涉及资金、订单等场景,必须额外设计幂等键(如订单号+业务类型),并在插入前检查。
  2. SQL 注入防护:AI 生成的 JPA 查询方法或 @Query 注解,如果使用原生 SQL 并拼接字符串,风险极高。必须坚持使用参数绑定(?1, ?2 或 :paramName)
    • 危险示例(AI可能生成): @Query("SELECT * FROM course WHERE name LIKE '%" + name + "%'")
    • 安全示例(应手动修正): @Query("SELECT c FROM Course c WHERE c.name LIKE %:name%")
  3. 并发安全:AI 可能生成“先查后改”的非原子操作,在高并发下会导致数据不一致(如库存超卖)。需要使用数据库悲观锁(SELECT ... FOR UPDATE)或乐观锁(@Version 注解)来保护。
  4. 数据权限与越权:AI 生成的 deleteCourse(id) 方法,可能不会校验当前登录用户是否有权限删除该课程。必须在 Service 层加入权限校验逻辑。
  5. 异常处理:AI 生成的代码可能只是简单抛出 RuntimeException,我们需要将其转换为定义好的业务异常,并确保异常信息不会泄露敏感系统细节。

5. 生产环境(毕设演示)避坑指南

即使只是毕设,以接近生产的标准要求自己,会加分很多。

  1. 依赖版本锁定:在 pom.xml 中使用 <dependencyManagement> 管理 Spring Boot 父工程版本,并明确所有主要依赖的版本号,避免不同环境构建时版本冲突。
  2. Prompt 工程技巧
    • 具体化:不要只说“生成一个Service”,要说“生成一个 CourseServiceImpl,实现分页查询课程的方法,使用 JPA Specification 实现动态查询,查询条件包括课程名和教师ID”。
    • 提供上下文:在写注释时,提及项目中已存在的类名(如 ResultPageResult),AI 会更好地利用上下文。
    • 要求遵循规范:在注释中写明“请遵循阿里巴巴 Java 开发规范”。
  3. 人工审查要点(Code Review for AI)
    • 安全性:检查 SQL、文件路径、命令执行等处有无注入风险。
    • 性能:检查循环内的数据库查询(N+1问题)、大对象序列化。
    • 健壮性:检查空指针、边界条件、异常处理是否完备。
    • 一致性:检查代码风格(命名、缩进)是否与项目其他部分一致。
    • 业务逻辑:这是 AI 最薄弱的一环,必须由你亲自确认逻辑是否正确。

图片

结尾:动手实践与思考

看到这里,你可能已经跃跃欲试了。我给你的一个小练习是:找一个你现有毕设项目中比较臃肿的 Controller 方法,尝试用 AI 助手来重构它。

比如,一个方法里既处理参数校验、又处理业务计算、还直接操作了数据库。你可以:

  1. 用注释向 AI 描述清晰的目标:“将这个 Controller 方法拆分为:参数校验(使用 Spring Validation)、业务逻辑(移到 XXService 的一个新方法)、数据库操作(在 Repository 层)。注意保持事务边界。”
  2. 观察 AI 生成的代码结构,然后手动调整、优化命名、补充日志和异常处理。

在这个过程中,你会更深刻地体会到:AI 最适合处理模式固定、逻辑明确的“搬砖”工作,而架构设计、核心算法、异常流程和深度业务逻辑,仍然需要你的主导和判断。找到人与 AI 协作的边界,让它成为你思维的延伸,而不是替代,这才是提升开发效率和质量的关键。

希望这篇笔记能帮你更从容、更专业地完成 Spring Boot 毕设。祝你答辩顺利!

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐