当 AI 真正“记住”你的项目:飞算 JavaAI 的上下文实战压力测试

0 阅读4分钟

说实话,一开始我对“AI 编程”这事儿挺 skeptical 的。 不是觉得它没用,而是太累了——每次让 AI 干点活,都得先当半小时“人肉提示工程师”: “我们返回体叫 Result,不是 Response!” “密码加密用的是 BCrypt,别自己造轮子!” “日志要打 info 级别,别一上来就 error!”

搞得我感觉不是在写代码,是在教一个记性特别差的实习生。

直到上周,我试了飞算的 JavaAI 插件,尤其是它的 「关联上下文」 功能——上传几个项目文件,AI 居然真的“记住”了我们项目的脾气。今天就聊聊两个让我眼前一亮的真实场景。


场景一:让 AI 做了个“新人三天才能搞定”的任务,它 10 分钟交差

我们有个老需求一直拖着没做:订单30分钟未支付自动取消,并发短信提醒用户。

按惯例,这种活会分给刚转正的同事练手——因为涉及定时任务、状态判断、外部调用,还得看懂现有订单服务怎么写的,一般得折腾两三天,外加三次 Code Review 才能合。

这次我决定“偷个懒”,试试飞算的 「智能引导」。

我做了什么?

  1. 在插件里新建对话,把项目里关键的 10 来个文件拖进去:
  1. Order.java(看状态字段)
  2. OrderService.java(看取消逻辑)
  3. CommonUtils.java(里面有 sendSms()
  4. Result.javaGlobalExceptionHandler.javaapplication.yml……
  1. 然后直接打字:“加个定时任务,30分钟没支付的订单自动取消,顺便发个短信。”

img

它干了啥?

不到一分钟,它吐出一个完整的 OrderAutoCancelTask.java

@Component
@Slf4j
public class OrderAutoCancelTask {
    @Autowired
    private OrderService orderService;
    @Scheduled(fixedDelay = 1800000)
    @Transactional
    public void cancelUnpaidOrders() {
        List<Order> unpaidOrders = orderService.list(
            new LambdaQueryWrapper<Order>()
                .eq(Order::getStatus, 0) // 待支付
                .lt(Order::getCreateTime, LocalDateTime.now().minusMinutes(30))
        );
        for (Order order : unpaidOrders) {
            try {
                orderService.cancelOrder(order.getOrderId()); // 复用已有方法
                CommonUtils.sendSms(order.getUserPhone(), "您的订单已超时取消");
                log.info("自动取消订单: {}", order.getOrderId());
            } catch (Exception e) {
                log.error("取消订单失败: {}", order.getOrderId(), e);
            }
        }
    }
}

我惊了:

  • 包路径跟我项目一致(com.xxx.order.task);
  • 用的是 LambdaQueryWrapper,不是原生 SQL;
  • 调的是已有的 cancelOrder(),没重复造轮子;
  • 短信用 CommonUtils.sendSms(),连模板都照搬我们风格;
  • 异常被捕获了,没直接抛出去(因为我们全局异常处理器只处理未捕获异常)。

最爽的是——我几乎没改一行,直接跑通了。

这要是以前,光“为什么不用 Result 包装”就得被后端组长问三遍。


场景二:修了个安全漏洞,AI 居然知道我们用 MyBatis-Plus

前几天安全扫描报了个 SQL 注入风险,定位到一段老代码:

String sql = "SELECT * FROM user WHERE email = '" + email + "'";
return jdbcTemplate.queryForObject(sql, User.class);

典型的字符串拼接,危险得很。

我本来打算手动改,但突然想试试 「AI工具箱」里的“Java安全修复器”。

img

操作很简单:

  1. 选中这段代码;
  2. 点插件里的“安全修复”;
  3. 等它分析(因为它已经加载了上下文)。

结果让我意外:

它没给我甩一句“请使用 PreparedStatement”,而是说:

“检测到项目使用 MyBatis-Plus,建议改用 Service 层的 lambda 查询,避免直接操作 JdbcTemplate。”

然后给了两个选项:

✅ 推荐方案(直接用 MP):

return this.lambdaQuery().eq(User::getEmail, email).one();

🛠️ 兼容方案(如果非要用 JdbcTemplate):

return jdbcTemplate.queryForObject(
    "SELECT * FROM user WHERE email = ?", 
    new BeanPropertyRowMapper<>(User.class), 
    email
);

还贴心备注:“根据 pom.xml,项目已引入 mybatis-plus-boot-starter,推荐使用方案一。”

这哪是 AI?这简直是那个总在 MR 里留言“建议用 MP”的架构师本人。

更绝的是,我顺手点了“生成单元测试”,它居然:

  • 继承了我们的 BaseTest
  • @MockBean 模拟了 mapper;
  • 测试用例覆盖了“查到用户”和“查不到”两种情况。

说点实在的:它也不是万能的

当然,用下来也发现几个小痛点:

  • 大项目上传慢:我们微服务模块一多,首次分析得等半分钟;
  • 改了代码得手动刷新上下文:比如我刚重构了 Result 类,但 AI 还按旧结构生成,得重新上传;
  • 前端文件基本看不懂:传了个 .vue 文件,它直接忽略。

但这些瑕不掩瑜。最大的价值是:它终于不用我一遍遍解释“我们项目是怎么玩的”了。


最后想说

以前我觉得 AI 编程就是“快一点的 Copilot”。

以前我以为 AI 编程只是“更快一点的 Copilot”。

现在才明白,真正的差距不在速度,而在理解力。

飞算 JavaAI 的「关联上下文」功能,本质上是在说:

“我不是来替你写代码的——我是来加入你团队的。”

如果你也受够了这些 AI 生成的“标准答案”:

  • 格式不对、命名随意
  • 忽略项目规范
  • 忘记统一响应体、漏掉权限校验……

不妨让它先读一读你的代码。

说不定,它比刚入职的实习生更懂你的工程风格。

🎁 现在参与官方「AI 编程炫技赛」,还能赢三重好礼:

京东卡、年货大礼包、专属荣誉证书等你拿!

🔗 活动入口:activity.feisuan.com/

🌐 官网体验:www.feisuanyz.com/home

📘 产品手册:www.feisuanyz.com/docs/langua…

🎥 功能演示 & 场景视频:mp.weixin.qq.com/s/YnVlWB960…

让 AI 真正成为你开发流程中可靠的一环——从“写得快”,到“写得对”。