从零手写 Spring:一周之内用 AI 实现自研 IoC、MVC 和嵌入式 Tomcat
本文基于 WWAIC(全周项目 AI 编程) 范式,介绍如何借助 AI 在 7 天内完成一个完整的 Java Web 框架 —— CodeStats,并深度剖析其自研 Spring 核心的实现原理。
依据与来源
-
CodeStats 项目地址:https://gitee.com/zhouzuoli/code-stats/
-
WWAIC 概念提出文章:https://blog.csdn.net/qq_41652036/article/details/161432743
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 定义、实例化、依赖注入 | BeanFactory, ApplicationContext |
spring.mvc |
DispatcherServlet、HandlerMapping、参数绑定、@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查询参数 -
@RequestBodyJSON 自动转换(基于 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 提供模板方法,支持 query、update、batchUpdate,以及 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 编程 感兴趣,欢迎:
-
关注我的 CSDN:
qq_41652036,持续输出 AI 编程、Java 底层原理的实战干货。 -
给 CodeStats 项目点个 Star:https://gitee.com/zhouzuoli/code-stats/ —— 你的每一个 Star 都是作者持续开源分享的动力!
-
点赞、收藏、转发 本文,让更多开发者了解 WWAIC 范式,一起探索 AI 时代的高效开发新方式。
学习永无止境,分享让技术更有温度。感谢你的阅读,我们下期再见!👋
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)