# Java Web自研框架18年架构决策复盘(系列文)

张开发
2026/4/3 15:47:37 15 分钟阅读
# Java Web自研框架18年架构决策复盘(系列文)
Java Web自研框架18年架构决策复盘系列文总纲非科班野生程序员深耕政务信息化20年这套自研Java Web框架支撑过省级新农保、全国首例跨省医保结算等核心民生系统18年稳定运行至今。本系列拆解10个核心架构决策全是政务场景踩坑后的实用解法不求优雅但求落地愿同赛道朋友少走弯路也欢迎懂行大佬轻拍指正。最后感谢豆包、智谱、OpenCode决策是我做的代码是我搓的文字是他们总结的。作者许彰午xuzhangwu我不是科班出身的专门搞架构的2001年从VC开始写代码2003年转PB/SQL2007年开始接触Java从那之后开始自己从零搭一套 Java Web 框架从Servlet到数据库每一层都是自己写的。这个框架跑了十几年还在用。我的不是教程是我对自己这套框架的架构决策的复盘。每一个决策背后都有一个真实的业务问题。系列文目录### 系列文1为什么放弃成熟的Spring我偏要手写轻量IOC容器核心看点三个自定义注解bean、property、responseMapping 一个BeanFactory搞定实例化、注入、路由注册适用场景部署环境受限、依赖要求极简的政务系统系列文2新老代码共存的终极解法——注解路由参数路由平滑迁移核心看点route.java的service()方法里一套判断逻辑先走注解路由找不到再走老的Business/Action参数路由适用场景系统迭代升级不能停机迁移### 系列文3前后端彻底解耦统一入参解析前端只发JSON后端随意核心看点praserInParameter()方法根据方法签名自动转换参数类型——DataCenter、Dao、List、HttpServletRequest 都能自动识别适用场景前端统一POST JSON后端方法签名随意定义### 系列文4轻量AOP落地CGLIB代理责任链搞定事务日志监控核心看点doProxyproxyFilter 责任链模式Trans、Logger、monitoring注解即用适用场景横切关注点不侵入业务代码### 系列文5解决Java编译痛点ASM字节码直读100%获取方法参数名核心看点getMethodParameterNamesByAsm4()用ASM直接读class文件字节码从LocalVariableTable获取参数名适用场景编译时不加-parameters也能拿到真实参数名### 系列文6ThreadLocal上下文管理让业务层彻底告别HttpServletRequest核心看点AppContextContainer继承 ThreadLocal在Servlet层绑定用户、连接等信息业务层随时取用适用场景业务代码不依赖Servlet API### 系列文7零侵入提升查询性能MongoDB混合存储不用Redis也能抗核心看点Dao上配置level属性1双写、2纯MongoDB异步同步、3纯关系库DBUtil自动路由适用场景不能引入Redis/MQ但又需要缓存层的政务系统### 系列文8改MyBatis源码1行搞定Oracle物理分页避开硬解析大坑核心看点PaginationInterceptor用绑定变量?做分页而非拼接SQL配合OracleDialect/MsSqlDialect方言适用场景Oracle环境下分页SQL硬解析导致性能问题### 系列文9政务报表自由Excel模板驱动业务人员改格式开发零参与核心看点doPrintView.java一个Servlet通吃所有报表Excel文件即模板jxl读数据转PDF预览适用场景报表格式频繁变动开发人员不想反复改代码### 系列文10突破Activiti限制政务工作流任意流转支持跳退回退核心看点turnTransition()运行时动态修改流程定义的连线跳转到任意节点完成后恢复原状适用场景政务审批需要自由跳转、回退、转办的场景框架全景图┌─────────────────────────────────────────────────────────┐ │ 前端层 │ │ browise RIA 框架基于 Dojo 封装 │ │ DataCenter / DataStore / JSON 序列化 │ └──────────────────────────┬──────────────────────────────┘ │ POST JSON │ ┌──────────────────────────▼──────────────────────────────┐ │ route.java唯一Servlet │ │ ┌──────────────┬──────────────┬──────────────┐ │ │ │ 登录校验 │ 路由分发 │ 异常处理 │ │ │ └──────────────┴──────────────┴──────────────┘ │ └──────────────────────────┬──────────────────────────────┘ │ ┌──────────────────────────▼──────────────────────────────┐ │ BeanFactoryIOC 容器 │ │ bean 实例化 property 注入 aoppoint 代理 │ │ │ │ CGLIB 代理 责任链模式 │ │ Trans 事务 Logger 日志 monitoring 监控 │ └──────────────────────────┬──────────────────────────────┘ │ ┌──────────────────────────▼──────────────────────────────┐ │ 业务层responseMapping 路由 │ │ Control → Service → MapperMyBatis │ └──────────────────────────┬──────────────────────────────┘ │ ┌──────────────────────────▼──────────────────────────────┐ │ DBUtilORM 层 │ │ ┌──────────────┬──────────────┬──────────────┐ │ │ │ MyBatis │ MongoDB缓存 │ 通用查询 │ │ │ │ CRUD │ level 1/2/3 │ JDBC方式写文件│ │ │ └──────────────┴──────────────┴──────────────┘ │ │ ┌──────────────┬──────────────┐ │ │ │ SM4加解密 │ AWR报告解读 │ │ │ │ myCode │ JVM监控 │ │ │ └──────────────┴──────────────┘ │ └──────────────────────────┬──────────────────────────────┘ │ ┌──────────────────────────▼──────────────────────────────┐ │ 数据库Oracle / MongoDB │ └─────────────────────────────────────────────────────────┘十个决策的统一原则决策原则自研 IOC只加需要的不加不需要的注解路由 参数兼容不破坏老系统统一入参解析前后端解耦CGLIB AOP加注解的方式ASM 参数读取自己的问题自己解决ThreadLocal 上下文业务层不依赖ServletMongoDB 混合存储零侵入渐进式采用改 MyBatis 源码分页第一天解决的事用了十几年Excel 模板报表用业务人员熟悉的工具Activiti 任意流转不能改变框架时就找到洞绕过去一句话做到实时有据修改即刻可查。不追求架构漂亮不追求技术先进只追求——出了问题我能从代码快速定位到业务业务人员能快速进入查到数据。这个框架没有 Spring 的依赖注入没有 MyBatis-Plus 的包装但这是它的一个优点每一行代码我都能说清来龙去脉任何问题我都能从入口一步步追踪到数据库。如果这些文章对你有启发欢迎点赞收藏评论。如果写得不对也请指正。毕竟是自己的框架难免有个人偏见欢迎在评论区讨论。系列导航- [系列文1为什么放弃成熟的Spring我偏要手写轻量IOC容器]- [系列文2新老代码共存的终极解法——注解路由参数路由平滑迁移]- [系列文3前后端彻底解耦统一入参解析前端只发JSON后端随意]- [系列文4轻量AOP落地CGLIB代理责任链搞定事务日志监控]- [系列文5解决Java编译痛点ASM字节码直读100%获取方法参数名]- [系列文6ThreadLocal上下文管理让业务层彻底告别HttpServletRequest]- [系列文7零侵入提升查询性能MongoDB混合存储不用Redis也能抗]- [系列文8改MyBatis源码1行搞定Oracle物理分页避开硬解析大坑]- [系列文9政务报表自由Excel模板驱动业务人员改格式开发零参与]- [系列文10突破Activiti限制政务工作流任意流转支持跳退回退]作者许彰午| 非科班野生程序员深耕政务信息化20年标签#Java #自研框架 #IOC #AOP #MyBatis #MongoDB #Activiti #政务信息化 #架构设计 #技术复盘

更多文章