本文基于 WWAIC(全周项目 AI 编程) 范式,介绍如何借助 AI 在 7 天内完成一个完整的 Java Web 框架 —— CodeStats,并深度剖析其自研 Spring 核心的实现原理。


依据与来源


1. 什么是 WWAIC?

WWAIC(Whole-Week AI Coding) 是一种新兴的 AI 辅助开发范式,核心主张是:

开发者在一周内,将整个项目的完整上下文一次性提交给 AI,由 AI 直接生成一个可运行的完整系统

相较于传统的对话式 AI 编程(Copilot、Cursor 等逐文件补全),WWAIC 强调 全项目上下文、一次性注入、约定一周交付,使开发者的角色从“代码编写者”转变为“架构设计者 + 集成验证者”。

CodeStats 正是 WWAIC 范式的首个实证项目 —— 一个从零开始、100% 由 AI 生成的 Java Web 框架,包含了自研 IoC 容器、MVC、嵌入式 Tomcat、JDBC 连接池、MyBatis 风格 Mapper、代码分析引擎等模块。本文重点分析其中仿 Spring 框架的设计与实现。


2. 整体架构:CodeStats 中的“Spring”

CodeStats 自研的 Web 框架没有依赖任何第三方库,完全从零实现,其核心模块包括:

模块 作用 对标 Spring 组件
spring.annotation 定义 @Component@Service@Controller@Autowired 等注解 spring-core 注解
spring.beans.factory IoC 容器核心,Bean 定义、实例化、依赖注入 BeanFactoryApplicationContext
spring.mvc DispatcherServletHandlerMapping、参数绑定、@ResponseBody Spring MVC
spring.boot SpringApplication.run() 启动入口,集成 Tomcat Spring Boot
tomcat 自研 Connector、Pipeline-Valve、类加载器 嵌入式 Tomcat
jdbc JdbcTemplate@Mapper 动态代理 Spring JDBC + MyBatis

下面我们逐层剖析其实现原理。


3. 自研 IoC 容器:从包扫描到依赖注入

3.1 注解驱动

仿照 Spring,定义了一系列注解:

java

// 声明 Bean
@Component, @Service, @Controller, @Repository
// 依赖注入
@Autowired, @Qualifier, @Primary
// 作用域
@Scope("singleton" / "prototype")

3.2 核心类结构

  • BeanDefinition:存储 Bean 的元信息(类名、作用域、是否懒加载等)。

  • DefaultListableBeanFactory:继承 AbstractAutowireCapableBeanFactory,实现 BeanDefinitionRegistry,负责 Bean 的注册、创建、缓存。

  • AnnotationConfigApplicationContext:扫描指定包,解析注解,注册 BeanDefinition,最后调用 refresh() 完成容器初始化。

关键代码片段(来自 AnnotationConfigApplicationContext):

java

protected void loadBeanDefinitions() throws Exception {
    Set<Class<?>> classes = PackageScanner.getClasses(basePackages);
    for (Class<?> clazz : classes) {
        if (isCandidateComponent(clazz)) {
            String beanName = getBeanName(clazz);
            BeanDefinition bd = new BeanDefinition(clazz.getName());
            bd.setBeanClass(clazz);
            ((DefaultListableBeanFactory) beanFactory).registerBeanDefinition(beanName, bd);
        }
    }
}

3.3 依赖注入实现

在 AbstractAutowireCapableBeanFactory.populateBean() 中,通过反射遍历字段,若存在 @Autowired 则调用 resolveDependency() 从容器中获取匹配的 Bean:

java

protected void populateBean(Object bean, BeanDefinition bd) throws Exception {
    for (Field field : bean.getClass().getDeclaredFields()) {
        if (field.isAnnotationPresent(Autowired.class)) {
            field.setAccessible(true);
            Object dependency = resolveDependency(field, bean);
            field.set(bean, dependency);
        }
    }
}

resolveDependency() 支持:

  • 按类型匹配(一个实现类 → 直接注入)

  • 多个实现类时,按 @Qualifier 或字段名匹配

  • 支持 @Primary 标记优先注入

3.4 单例与原型作用域

AbstractBeanFactory 维护一个 singletonObjects 缓存,对于 scope=singleton 的 Bean,在第一次创建后缓存;对于 prototype 则每次创建新实例。


4. MVC 实现:DispatcherServlet 与参数绑定

4.1 请求映射

DispatcherServlet 在初始化时扫描所有 @Controller 类,解析 @RequestMapping 方法,构建 HandlerMapping 列表,支持路径变量/{id})和正则匹配。

java

HandlerMapping(String regex, List<String> varNames, Object controller, Method method, boolean isResponseBody)

4.2 参数解析器(ParamBinder

支持多种参数类型:

  • HttpServletRequest / HttpServletResponse

  • @PathVariable 路径变量

  • @RequestParam 查询参数

  • @RequestBody JSON 自动转换(基于 Jackson)

  • @RequestPart 文件上传(与 MultipartResolver 配合)

核心方法 ParamBinder.resolveParameters() 通过反射获取方法参数,逐个根据注解解析值并转换类型。

4.3 视图与响应

  • 若方法有 @ResponseBody,则返回值通过 HttpMessageConverter 转换为 JSON 或字符串写入响应。

  • 否则,返回 ModelAndView 会通过 ViewResolver 渲染(目前简单实现为拼接 HTML)。

4.4 静态资源服务

DispatcherServlet 同时负责 /webapps/ 下的静态文件(html、css、js)服务,路径安全检查防止目录遍历。


5. 嵌入式 Tomcat:从 Connector 到 Pipeline

CodeStats 实现了一个迷你版 Tomcat,完全自研,不依赖任何外部容器。

5.1 Connector(连接器)

监听指定端口(默认 28080),采用 BIO + 线程池 模型,每收到一个 Socket 请求就提交给线程池处理。解析 HTTP 请求行和头部,生成 Request 和 Response 对象。

java

// Connector 核心循环
while (running) {
    Socket socket = serverSocket.accept();
    threadPool.submit(() -> process(socket));
}

5.2 Pipeline-Valve 责任链

借鉴 Tomcat 的设计,Container(Engine / Host / Context / Wrapper)都拥有一个 Pipeline,内部包含多个 Valve。每个 Valve 可以处理请求并决定是否调用下一个 Valve。最终 Wrapper 的 Valve 会调用 Servlet.service()

java

public void invoke(Request request, Response response) throws Exception {
    new ValveChainImpl().invokeNext(request, response);
}

5.3 类加载隔离

StandardContext 使用 WebappClassLoader(继承 URLClassLoader)为每个 Web 应用(demo)独立加载 /WEB-INF/classes 和 /WEB-INF/lib 下的类,实现应用间的类隔离。

5.4 Servlet 生命周期

StandardWrapper 负责加载 servletClass,实例化 Servlet,并调用 init()。请求到达时通过 ApplicationFilterChain 依次执行 Filter,最后调用 servlet.service()


6. 数据访问层:JdbcTemplate 与 Mapper 代理

6.1 JdbcTemplate

自研 JdbcTemplate 提供模板方法,支持 queryupdatebatchUpdate,以及 RowMapper 将 ResultSet 映射为实体对象。

java

public <T> List<T> query(String sql, RowMapper<T> rowMapper, Object... args)

内置 BeanPropertyRowMapper 通过反射将数据库列名(下划线转驼峰)赋值给 JavaBean。

6.2 MyBatis 风格 Mapper

定义 @Mapper 注解,@Select@Insert@Update@Delete 注解在接口方法上。AnnotationConfigApplicationContext 在容器启动时扫描 @Mapper 接口,并通过 java.lang.reflect.Proxy 创建动态代理对象:

java

Object proxy = Proxy.newProxyInstance(
    beanClass.getClassLoader(),
    new Class[]{beanClass},
    new MapperProxy(new JdbcTemplate())
);

MapperProxy 解析 SQL 中的 #{xxx} 占位符,构建参数列表,调用 JdbcTemplate 执行,并根据返回类型自动映射为 List 或单对象。


7. 项目亮点与 WWAIC 实践意义

7.1 项目整体亮点

  • 完全自研:无任何第三方框架依赖(仅使用 JDBC 驱动和 Jackson 等必要库),代码量超过 3 万行。

  • 功能完备:不仅包含自研的 Spring 内核与嵌入式 Tomcat,还集成了数据库客户端、代码分析引擎、AI Agent、目录管理等实用工具。

  • 教学级注释:代码注释详细,适合学习底层原理。

  • 前端科技感界面:玻璃拟态设计、多标签 iframe 架构,无前端框架依赖。

7.2 WWAIC 的实践意义

回顾 CodeStats 项目,其全部代码(包括以上所有 Spring 核心实现)均由 AI 在 7 天内生成,这印证了 WWAIC 范式的可行性:

  • 大幅缩短原型开发周期:传统手写一个轻量级 IoC+MVC 框架需要数周,而 WWAIC 压缩到一周。

  • 降低学习门槛:通过 AI 生成的教学级注释,开发者可以直接学习自研框架的底层原理(如类加载、反射、动态代理、责任链等)。

  • 启发新分工模式:人类负责架构设计、约束定义和最终验证,AI 负责大规模代码生成。

当然,WWAIC 目前主要适用于中小型项目、原型验证和教学场景,对于生产级系统在性能、安全、可维护性上仍需人工打磨。但作为一种探索,它已经展示了 AI 编程的全新可能性。


附录:核心代码结构速览

text

com.omni.framework
├── spring
│   ├── annotation          // 注解定义
│   ├── beans.factory       // IoC 容器核心
│   ├── context             // ApplicationContext
│   ├── mvc                 // DispatcherServlet
│   └── boot                // SpringApplication 启动类
├── tomcat                  // 嵌入式 Tomcat
├── jdbc                    // JdbcTemplate + Mapper 代理
└── codestats               // 代码分析引擎(另一个独立模块)

🌟 最后的话

如果你也对 自研框架 + AI 编程 感兴趣,欢迎:

  • 关注我的 CSDNqq_41652036,持续输出 AI 编程、Java 底层原理的实战干货。

  • 给 CodeStats 项目点个 Starhttps://gitee.com/zhouzuoli/code-stats/ —— 你的每一个 Star 都是作者持续开源分享的动力!

  • 点赞、收藏、转发 本文,让更多开发者了解 WWAIC 范式,一起探索 AI 时代的高效开发新方式。

学习永无止境,分享让技术更有温度。感谢你的阅读,我们下期再见!👋

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐