当前位置: 首页 > news >正文

全球首款为ai 应用编程的框架出现,AIfei

Aifei 架构师深度解析  设计哲学 · 新理念解构 · 优秀代码范式 · 新手全通透Just Service. Only Aifei can do.

写在前面 — 用什么眼光看 Aifei

"当所有人都在讨论 AI 能不能写代码的时候,Aifei 在思考另一个问题:框架应该为 AI 写代码做什么准备。"

Aifei 不是 JFinal 的下一个版本,也不是 Spring 的简化版。它是一次范式转换——从「服务人类开发者的认知习惯」转向「服务大模型的工作机制」。理解 Aifei 需要先建立一个认知:
大模型写代码不是「会打字的程序员」,而是一个有注意力预算、有上下文窗口限制、有生成模式偏好的信息处理系统。Aifei 的每一个设计决策,都是在为这个系统做优化。

 

第一章  信息论视角下的框架设计

 

 
 
// Out统一返回
层次二认知层面 消除多范式并存传统框架中开发者 AI需要同时掌握多套数据对象范式
传统框架的数据对象混乱Aifei 的统一抽象Entity数据库映射对象Row通用行也是 Model 的基类VO视图对象前端展示用直接返回 Row/Model框架自动序列化DTO数据传输对象Map Row接收参数PO持久化对象不存在Row 直接持久化ModelActiveRecord 模式User extends AifeiRowis-a Row 层次三生成层面 提供稳定的代码模式Just Service AI 提供了一个固定模板」,使代码生成具有高度可预测性Just Service 代码模板 AI 只需填入 [] 括号内的业务内容// Aifei Service 的固定代码模式AI 只需填入业务部分):@Path("/[资源名]") // 固定填资源名public class [资源]Service { // 列表/分页查询固定模式 public Page<[Model]> index(Map<?,?> filter, int pageNum, int pageSize) { String sql = "select * from [] #where(...) #orderBy(...)"; // 填业务 return [Model].sql(sql, filter).paginate(pageNum, pageSize); } // 查详情固定模式 public [Model] detail(int id) { return [Model].findById(id); // 填业务 } // 插入固定模式 public Out insert([Model] model) { model.insert(); // 填业务 return Out.ok(); } // 更新固定模式 public Out update([Model] model) { model.update(); // 填业务 return Out.ok(); } // 删除固定模式 public Out delete(int id) { [Model].deleteById(id); // 填业务 return Out.ok(); }} 优秀设计 这个模式的精妙之处结构固定变化点清晰AI 每次生成时只需关注「[资源名]」「[Model]」「[]」「[业务条件]」四个变量其余全是不变量生成准确率极高 第三章 数据库设计的五个突破
 
 
3.1 突破一链式 sql() 作为统一查询入口传统 JFinal 的查询 API 存在多入口问题 JFinal 多入口问题// JFinal 的多入口问题AI 需要选择正确的入口):User.dao.find(sql, paras); // 入口 1Model dao 对象User.dao.findFirst(sql, paras); // 入口 2同上User.dao.paginate(p, s, sel, from); // 入口 3注意 select from 要分开User.dao.template("key", paras); // 入口 4SQL 模板方式Db.find(sql, paras); // 入口 5Db 工具类Db.findFirst(sql, paras); // 入口 6同上Db.paginate(p, s, sel, from); // 入口 7注意 select from 要分开Db.getSqlPara("key", paras); // 入口 8先拿 SqlPara 再查// AI 在生成代码时经常在这 8 种入口之间犹豫并出错 Aifei 统一入口sql() 链式执行方法// Aifei 的统一入口sql() 链式调用// 所有查询都从 sql() 开始链式决定执行方式Db.sql(sql, params).find(); // 统一入口链式选择执行方式Db.sql(sql, params).findFirst();Db.sql(sql, params).findOne();Db.sql(sql, params).paginate(p, s);Db.sql(sql, params).queryLong();Db.sql(sql, params).update();// Model 版本同样统一User.sql(sql, params).find();User.sql(sql, params).paginate(p, s);User.sql(sql, params).forEachPage(10, page -> { ... }); 设计本质 设计本质这不只是 API 风格变化而是减少分叉」。AI 在生成代码时分叉越少出错概率越低统一入口让 AI 只需学会一个模式想查数据 sql(),然后链式选择执行方式 3.2 突破二Model is-a Row继承而非并列这是 Aifei 数据模型最优雅的设计决策之一值得深入理解 JFinal 的问题Model Record 是并列的两套体系 JFinalModel Record 是并列的两套体系// JFinal Model Record 是完全不同的类型Useruser=User.dao.findById(1);//返回Model<User>Recordr=Db.findFirst(sql);//返回Record完全不同的类型!)//两套API两种取值方式user.getStr("name");//Model取值r.getStr("name");//Record取值看起来一样但类型不同//问题当你需要对结果做统一处理时需要写两套代码//AI在生成处理逻辑时不知道该用Model还是RecordAifeiModelis-aRow类型统一//AifeiModelis-aRowModel继承自Row):publicclassUserextendsAifeiRow<User>{...}//User就是RowRow就是User//统一类型体系Useruser=User.findById(1);//返回User也是RowRowrow=Db.sql(sql).findFirst();//返回Row
 
 
// 统一 API因为 User 就是 Row):user.getName(); // user.get("name")row.get("name");// 统一处理可以用同一套逻辑处理 User Row):void process(Row row) { // 接收 RowUser 也可以传入 String name = row.get("name"); // ...} 架构洞见 架构洞见is-a 关系继承 has-a 关系组合在这里更优雅的原因业务代码不需要类型转换方法签名可以统一声明为 Row自然接受所有 Model 子类多态生效这是面向对象设计原则的完美应用 3.3 突破三of() 工厂方法消灭先查后改这是一个小设计但体现了极深的用户体验思考of() 工厂方法 vs 传统写法// 场景修改 id=123 的用户姓名// Spring JPA 写法先查再改两次数据库操作):User user = userRepository.findById(123).orElseThrow();user.setName("james");userRepository.save(user);// 问题为了改一个字段先发了一条 SELECT产生不必要的 IO// JFinal 写法需要先 new 一个 Model手动设置主键):new User().set("id", 123).set("name", "james").update();// 稍好 set("id", 123) 的写法不直观容易忘// Aifei 写法User.of(123).name("james").update();// of(123) = 创建持有 id=123 User 实例不查库// name("james") = 设置 name 字段流式 setter// update() = 只更新被 set 的字段 优秀设计 优秀设计点of(id) 方法在不查数据库的情况下创建一个持有主键的对象实例update() 框架知道这是 WHERE id=? 的更新一行代码零多余 SQL语义完全清晰 3.4 突破四:#where / #and / #orderBy 结构化动态 SQL这是 Aifei SQL 管理上最具革命性的创新值得用较多篇幅分析 为什么动态 SQL AI 的噩梦动态 SQL 的本质问题是SQL 语句的形状在运行时才确定传统的解决方案是模板分支」,但这对 AI 成极不友好 传统动态 SQL分支多易出错有注入风险// 传统动态 SQLJFinal/MyBatis 风格):String sql = "select * from user where 1=1";// AI 需要生成这样的 Enjoy 模板有多种写法容易出错):#sql("findUser")select*fromuserwhere1=1#if(name)容易漏写andnamelikeconcat('%',#para(name),'%')#end容易漏写#end#if(status!=null)andstatus=#para(status)
 
 
#end #if(minAge != null) and age >= #para(minAge) #end #if(orderField != null && !orderField.isEmpty()) order by #(orderField) #(orderDir) SQL注入风险orderField 直接拼 #end#end// 问题// 1. 每个条件都要 #if/#end 包裹AI 容易漏写 #end// 2. 排序字段直接拼字符串有 SQL 注入风险// 3. 生成结构不稳定不同 AI 可能产生不同风格 Aifei #where / #and / #orderBy结构化零风险// Aifei 新动态 SQL 指令// 格式:#where(字段, 操作符, 变量名) -- 变量为 null 时自动忽略// #and(字段, 操作符, 变量名) -- 同上// #orderBy(白名单字段列表) -- filter 中读取排序意图// 同样的查询需求Aifei 写法String sql = "select * from user" + " #where(name, 'like', name)" + " #and(status, '=', status)" + " #and(age, '>=', minAge)" + " #orderBy(created, id, name)"; // 括号内是白名单只允许这三个字段排序// Java 调用 filter Mapnull 值自动过滤):return User.sql(sql, filter).paginate(pageNum, pageSize);// 前端传 filter:{ name: 'james', status: 1 } // minAge 不传// 生成 SQLselect * from user where name like ? and status = ?// 前端传 filter:{ orderBy: { field: 'created', order: 'desc' } }// 生成 SQL:... order by created desc 因为 created 在白名单中 三大指令的设计精髓指令解决的问题设计精妙之处#where(f,'op',v)动态首个条件何时用 WHERE变量为 null 时整条指令不输出自动选择 WHERE 或省略#and(f,'op',v)动态追加条件变量为 null 时整条指令不输出无需 #if 包裹#orderBy(whitelist)安全动态排序白名单机制只有括号内的字段可排序天然防注入 设计本质 设计本质这三个指令把动态 SQL命令式你告诉我什么时候加条件)」变成了声明式你告诉我条件规则我自动处理)」。声明式代码对AI更友好因为意图清晰没有隐藏的状态转换3.5突破五批量操作的自动分组这个功能解决了一个在实际开发中频繁出现但长期被忽视的痛点批量写入时各行字段不一致Aifei批量操作自动分组字段结构不一致也完美处理//典型场景Excel导入用户数据不同行填了不同字段//第1行姓名+手机号//第2行姓名+邮箱+年龄//第3行姓名+手机号+部门//传统解决方案非常繁琐)://1.先按字段组合分组//2.每组单独构造PreparedStatement//3.每组单独执行批量
 
 
// 或者每行单独 INSERT性能极差// Aifei 解决方案List<Row> rows = new ArrayList<>();rows.add(new Row().set("name","Alice").set("phone","13800000001"));rows.add(new Row().set("name","Bob").set("email","bob@test.com").set("age",25));rows.add(new Row().set("name","Carol").set("phone","13800000003").set("dept","研发"));Db.batch().insert("user", rows); // 框架自动按字段组合分组分组执行批量插入// Aifei 内部自动// 组1name+phone):Alice, Carol 一次 batch// 组2name+email+age):Bob 一次 batch 架构洞见 这个功能的背后是 BatchUpdateExecutor 的设计它先按字段集合 groupByFields(),然后在事务中按分组执行批量操作这个设计让批量操作从需要预处理变成了直接丢进去就行」,符合信息论原则——不要让使用者维护本可以自动推导的状态 第四章 AifeiConfig 集中式配置的哲学 4.1 分散式配置 vs 集中式配置Spring Boot 的配置哲学是约定优于配置」——尽量不让用户配置用约定代替这在小项目中很方便但在大模型生成代码时是个严重问题 约定的副作用隐式行为 约定优于配置隐式行为对 AI 不友好// Spring Boot 隐式行为示例// 你加了 spring-boot-starter-data-jpa 依赖// 框架自动扫描所有 @Entity // 自动创建表如果 ddl-auto=create),// 自动配置 EntityManager// 自动开启事务管理// 这些行为都是隐式在代码里看不见// AI 的影响// AI 生成代码时不知道这些隐式行为的存在// 生成的代码可能与隐式行为冲突如手动配置了 DataSource// AI 无法通过读代码来理解完整的系统行为 Aifei 显式配置系统行为完全可见// Aifei 显式配置」:所有配置都在 AifeiConfig 一览无余public class AppConfig implements AifeiConfig<In, Out> { public void config(Settings<In, Out> settings) { // 服务器显式指定一目了然 settings.setServer(new UndertowServer(), new IoDispatcher()); // 处理器显式添加执行顺序清晰 settings.addHandler(new AuthHandler()); settings.addHandler(new LogHandler()); // 参数注入显式注册没有魔法 settings.configArgument(kit -> kit.register(Account.class, LoginArgument.class)); } public void config(Routes routes) { // 路由显式扫描哪个包带哪个拦截器 routes.scan("cn.myapp.api", newAuthInterceptor());}publicvoidconfig(Pluginsplugins){
 
 
// 数据库显式配置参数清晰 AifeiDbPlugin db = new AifeiDbPlugin("main", new DruidSupplier(...)); db.addModelSet(new ModelSet()); plugins.add(db); }}// AI 读这段代码能完全理解系统做了什么没有任何隐式行为 优秀设计 AifeiConfig 的三个 config 重载方法体现了一个入口参数类型即语义的设计哲学config(Settings) 配系统级设置config(Routes) 配路由config(Plugins) 配插件参数类型本身就是文档 4.2 HIO 模型 处理流程的极简化Aifei HIOHandler-Input-Output模型是对 Servlet 生命周期的重新抽象概念 Aifei 中的含义为什么这样设计HandlerH请求处理链上的节点如认证日志限流显式配置顺序行为可预测InputI用户自定义的请求输入对象不依赖 Servlet可切换 IO 实现OutputO用户自定义的响应输出对象 Out 统一返回结构序列化由框架完成Dispatcher将请求分发到正确 Service 方法的组件分发逻辑框架化无需用户干预 新手理解 新手理解你可以把 HIO 理解为一条加工流水线」。Input 是原材料HTTP 请求),Handler 是一道道工序认证日志等),Dispatcher 是工厂调度员找到正确的 Service 方法),Output 是成品HTTP 响应)。这条流水线的每一段都是显式配置的没有隐藏工序 第五章 优秀代码范式精讲 5.1 范式一链式 API 的极致运用Aifei 全面采用链式 API这不仅仅是风格偏好而是减少临时变量降低认知负载的工程决策 设计原则每一步都有意义每一步都不多余链式 API 三要素示例// 链式 API 的设计三要素// 1. 每个方法返回 this 或下一阶段对象使链式成为可能// 2. 方法名即操作语义name(v) set("name",v) 更直接// 3. 终结方法表明操作类型find/insert/update/delete// 示例一Model 的链式构建与操作new User() // 创建实例 .name("james") // 设置字段方法名 = 字段名 .age(25) // 设置字段 .email("j@test.com") // 设置字段 .insert(); // 终结插入数据库
 
 
// 示例二查询链User.sql("select * from user #where(status,'=',status)", filter) .paginate(pageNum, pageSize); // 终结分页查询// 示例三修改链of 工厂 + 链式设置 + 终结User.of(123) // 工厂持有 id=123 的实例 .name("newName") // 设置要更新的字段 .status(2) // 设置要更新的字段 .update(); // 终结只更新被设置的字段 设计本质 链式 API 的深层价值代码的阅读顺序与执行顺序一致从左到右从上到下),零跳跃理解成这对于 AI 生成代码尤其重要AI 可以按自然语言描述的顺序直接生成链式代码 5.2 范式二统一返回对象 OutOut Aifei 中所有 Service 方法操作类接口的统一返回类型查询方法返回具体数据操作方法返回 Out)。Out 统一返回对象// Out 的设计理念统一成功/失败表达// 静态工厂方法语义极清晰return Out.ok(); // 成功无消息return Out.ok("操作成功"); // 成功带消息return Out.ok(user); // 成功带数据return Out.fail("用户不存在"); // 失败带原因return Out.fail("余额不足", 402); // 失败带错误码// Spring 的对比// Springreturn ResponseEntity.ok().body(data) // 冗长// Springreturn ResponseEntity.status(400).body(error) // 更冗长// Aifeireturn Out.ok(data) / return Out.fail(msg) // 简洁 在事务中返回 Out 的妙用Out + 事务的完美结合// 传统写法事务和返回值分离需要额外变量Out result;Db.tx(() -> { // ... 业务逻辑 ... result = n == 1 ? Out.ok("成功") : Out.fail("失败"); // 无法在 Lambda 内赋值外部变量 return result.isOk(); // JFinal 返回 boolean});return result; // 还需要额外返回// Aifei 写法事务直接返回业务结果return Db.transaction(tx -> { int n1 = Db.sql("update account set money=money-? where id=?", money, fromId).update(); int n2 = Db.sql("update account set money=money+? where id=?",money,toId).update();returnn1==1&&n2==1?Out.ok("转账成功"):Out.fail("转账失败");//失败时框架自动回滚Out.fail触发回滚机制});//事务和业务结果完美合并无多余变量代码意图100%清晰优秀设计Out在事务中的设计尤为精彩transaction()Lambda直接返回Out框架根据Out.isOk()决定提交或回滚业务逻辑和事务控制完全融合零冗余代码5.3范式三参数自动注入的分层设计
 
 
Aifei 的参数注入系统是可扩展的固定模式的典范设计参数注入的四层架构// 参数注入的分层结构// 层次1基础类型框架内置无需配置public void someAction(int id, String name, long timestamp) { ... }// 直接从 URL 参数注入零配置// 层次2Map框架内置接收所有参数public void search(Map<?,?> filter) { ... }// 所有 URL/表单参数合并为 Map零配置// 层次3Model/Row框架内置JSON 反序列化public Out save(User user) { ... }// 请求体 JSON 自动反序列化为 User零配置// 层次4自定义类型用户扩展一次注册处处可用// 注册阶段只写一次):settings.configArgument(kit -> { kit.register(Account.class, LoginAccountArgument.class); kit.register(Tenant.class, TenantArgument.class);});// 使用阶段任意 Service 方法直接声明):public Page<Order> myOrders(Account account, Tenant tenant, Map<?,?> filter) { String sql = "select * from order where user_id=? and tenant_id=?"; return Order.sql(sql, account.getId(), tenant.getId()).paginate(1, 20);} 架构洞见 这个设计的精妙四个层次从简单到复杂每一层都有明确的职责扩展点清晰新手用层次1-3就够了高级用法在层次4但接口一致这是渐进式复杂度的体现 5.4 范式四forEachPage 大数据分批处理这个 API 设计展示了 Aifei 大数据量场景下的用心forEachPage大数据量分批处理的最优解// 问题场景对全表用户发送邮件通知// 危险写法全量查询List<User> allUsers = User.sql("select * from user").find();for (User u : allUsers) { sendEmail(u); }// 问题100万用户 = OOM内存溢出// 传统分页写法繁琐int page = 1, size = 100;while (true) { Page<User> p = User.sql("select * from user").paginate(page, size); for (User u : p.getRows()) { sendEmail(u); } if (page >= p.getTotalPage()) break; page++;}//AifeiforEachPage优雅分批User.sql("select*fromuser").forEachPage(100,(Page<User>page)->{for(Useru:page.getRows()){sendEmail(u);}returntrue;//继续下一页//returnfalse;//提前终止});//自动处理分页逻辑内存安全可提前终止代码极简优秀设计forEachPage的设计亮点Lambda返回boolean控制是否继续迭代这让找到目标即停的场景变得优雅同时框架内部使用游标式分页每次只加载一批数据到内存天然内存安全
 
 
第六章 Aifei 的设计哲学总结
6.1 七个核心设计原则
原则一代码即文档好的代码不需要注释就能理解Aifei API 命名遵循读代码 = 读业务描述的原则User.of(123).name("james").update(); // 直读 id=123 的用户名字改为 jamesDb.batch().insert("user", rows); // 直读批量插入 rows user Out.ok("操作成功"); // 直读返回成功消息是操作成功 原则二单一入口链式分叉每种操作只有一个入口执行方式通过链式调用在末端分叉而不是在入口处分叉// 所有查询唯一入口sql()Db.sql(sql, params).find() // 末端分叉查多条Db.sql(sql, params).findFirst() // 末端分叉查第一条Db.sql(sql, params).paginate(p,s) // 末端分叉分页Db.sql(sql, params).queryLong() // 末端分叉查单值// 学一个入口通过末端方法名选择行为零歧义 原则三显式优于隐式所有系统行为都在代码中可见没有约定魔法没有注解黑盒没有自动配置惊喜 原则四渐进式复杂度简单场景用简单 API复杂场景才需要复杂配置简单场景绝不被复杂场景的存在所污染// 简单场景新手):User.findById(1);// 中等场景User.sql("select * from user #where(name,'=',name)", filter).find();// 复杂场景高级):User.sql(sql, filter).forEachPage(100, page -> { ...; return true; });// 每层复杂度独立新手不需要了解高级用法才能入门 原则五信息无冗余每一行代码都承载业务信息不存在仅用于满足框架要求的样板代码测量标准把这行代码删掉业务信息会丢失吗 保留不会 删除 原则六类型即约束用类型系统表达约束而不是用文档或约定。`#orderBy(created, id)` 的白名单就是类型约束的体现——在白名单里的字段在类型层面就被排除了 原则七为下一个人 AI设计
 
 
代码的最终读者不是写代码的人而是维护代码的人人或 AI)。Aifei 的每个设计都在问:「这段代码AI或下一个开发者能一眼看懂吗?」 6.2 Aifei 的哲学定位"极简不是目标而是结果当你把所有不必要的东西都去掉之后剩下的就是极简的。"Aifei 的极简不是功能少」,而是概念少」。它功能完整覆盖了 JFinal 的所有数据库能力但概念数量减少了 60% 以上这就是架构设计中最难的部分」:不是加功能而是在加功能的同时不增加概念Aifei 做到了这一点是它最值得学习和尊重的地方设计维度传统框架的答案Aifei 的答案框架服务谁人类开发者的工程习惯大模型的工作机制 + 人类的阅读体验复杂度来自哪功能丰富场景覆盖不必要的概念分层和样板代码如何衡量好坏功能完整性社区生态注意力浓度概念密度生成稳定性配置哲学约定优于配置隐式行为显式配置行为完全可见扩展哲学Plugin/SPI 复杂扩展点Handler/ArgumentProvider 最小扩展接口数据操作多套并行体系Entity/DTO/VO/Record单一体系RowModel is-a Row动态 SQL命令式分支(#if/#end声明式指令(#where/#and/#orderBy

 

http://www.jsqmd.com/news/743411/

相关文章:

  • LLVM与模型缝合技术:编译器优化的新范式
  • 2026北京抖音推广公司排行:资质与成效双维度标杆名录 - 奔跑123
  • FontCreator实战:5分钟搞定老旧TTF字体的修复与现代化改造(以思源宋体为例)
  • 【卷卷观察】VS Code现在会强插“Co-Authored-by Copilot“,不管你用没用AI编程
  • 2026年留学生写essay如何降AIGC率?Turnitin保姆级收藏指南(附超神工具) - 降AI实验室
  • GAPERON模型:多语言与代码任务的协同优化实践
  • 抖音内容高效管理:开源无水印下载工具全方位解析
  • BabelDOC终极指南:如何零代码损失实现PDF文档的智能双语转换
  • 【国家等保三级+GJB 5792-2006双标合规】:手把手实现C语言固件镜像签名验证与动态完整性度量
  • Switch手柄PC终极适配指南:用BetterJoy解锁任天堂手柄的完整功能
  • 开源硬件社区补丁应用指南:从OpenClaw机械臂实践到固件定制
  • 如何快速配置MusicFree插件:面向新手的完整开源音乐解决方案指南
  • 告别光猫配置烦恼!zteOnu命令行工具让网络管理效率提升300%
  • 北京抖音代运营口碑评测:4家头部服务商实力对比 - 奔跑123
  • DoL-Lyra自动化构建系统:从位运算到并行打包的技术实践
  • 嵌入式固件防篡改实战:从CRC校验到白盒密码学,90%工程师忽略的7层防护链
  • ClawLodge:OpenClaw生态的配置共享中心与AI智能体开发加速器
  • 如何快速开发SystemUI模块?
  • 视觉语言模型VAPO框架:动态注意力与多模态提示优化
  • 容器安全调用宿主机命令:acp-bridge架构原理与实战部署指南
  • MiGPT技术深度解析:基于大语言模型的智能音箱对话系统架构设计
  • FPGA架构对比:Cyclone与Spartan-3性能深度解析
  • XHS-Downloader技术深度解析:如何构建高效的小红书内容采集系统
  • AMD Ryzen深度调试终极指南:SMUDebugTool专业硬件调优工具解析
  • Linux沙箱技术解析:基于命名空间与Cgroups的安全命令执行环境
  • Sunshine游戏串流:轻松打造你的个人云游戏中心
  • 联想拯救者工具箱终极指南:免费替代Vantage的完整性能优化教程
  • Ollama Web UI部署指南:本地大模型可视化交互与性能优化
  • 【2026 OTA安全升级黄金代码库】:纯C实现、无RTOS依赖、内存占用<4KB——已通过TÜV Rheinland功能安全认证(ASIL-B ready)
  • TaoCarts 反向海淘系统:基于 Spring Cloud 的微服务架构设计与高并发实践