0. 总纲|Java Web 自研框架 18 年Java架构决策复盘
深耕政务信息化 20 年,自研 Java Web 框架支撑省级新农保、全国首例跨省医保结算等核心民生系统,稳定运行 18 年。
本系列不讲空泛理论,只复盘真实生产环境下的架构决策、踩坑经历、落地方案,不求优雅,但求能跑、能扛、能维护。
在长期维护政务系统的过程中,我逐渐形成一套轻量、稳定、无侵入、可长期演进的架构思路。
这套框架没有依赖流行全家桶,而是围绕业务痛点一点点打磨,最终支撑了海量高并发、高可靠的民生业务。
本系列将从以下 10 个核心决策展开:
1. 放弃 Spring,手写轻量 IOC 容器
2. 注解路由 + 参数路由,实现新老代码平滑迁移
3. 统一入参解析,前后端彻底解耦
4. CGLIB + 责任链实现轻量 AOP,搞定事务、日志、监控
5. ASM 字节码直读,100% 获取方法参数名
6. ThreadLocal 上下文管理,业务层彻底告别 Http
7. MongoDB 混合存储,零侵入提升查询性能
8. 修改 MyBatis 源码 1 行,搞定 Oracle 物理分页
9. Excel 模板驱动政务报表,业务人员直接改格式
10. Activiti 工作流任意跳转、回退,满足政务灵活审批
所有内容均来自生产环境真实落地,可直接复用、可直接用于面试、可直接写进简历。
本文为 Java 政务企业级实战系列总纲,全系列共 10 篇,拆解 IOC、AOP、MongoDB、MyBatis、Activiti 工作流等政务开发核心技术。
收藏追更不迷路,评论区聊聊你在政务/企业开发中最头疼的架构问题!
系列文目录
### 系列文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代理+责任链,搞定事务日志监控
- 核心看点:
doProxy+proxyFilter+ 责任链模式,@Trans、@Logger、@monitoring注解即用 - 适用场景:横切关注点不侵入业务代码
### 系列文5:解决Java编译痛点!ASM字节码直读,100%获取方法参数名
- 核心看点:
getMethodParameterNamesByAsm4()用ASM直接读class文件字节码,从LocalVariableTable获取参数名 - 适用场景:编译时不加
-parameters也能拿到真实参数名
### 系列文6:ThreadLocal上下文管理,让业务层彻底告别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) │ │ ┌──────────────┬──────────────┬──────────────┐ │ │ │ 登录校验 │ 路由分发 │ 异常处理 │ │ │ └──────────────┴──────────────┴──────────────┘ │ └──────────────────────────┬──────────────────────────────┘ │ ┌──────────────────────────▼──────────────────────────────┐ │ BeanFactory(IOC 容器) │ │ @bean 实例化 @property 注入 @aoppoint 代理 │ │ │ │ CGLIB 代理 + 责任链模式 │ │ @Trans 事务 @Logger 日志 @monitoring 监控 │ └──────────────────────────┬──────────────────────────────┘ │ ┌──────────────────────────▼──────────────────────────────┐ │ 业务层(@responseMapping 路由) │ │ Control → Service → Mapper(MyBatis) │ └──────────────────────────┬──────────────────────────────┘ │ ┌──────────────────────────▼──────────────────────────────┐ │ DBUtil(ORM 层) │ │ ┌──────────────┬──────────────┬──────────────┐ │ │ │ MyBatis │ MongoDB缓存 │ 通用查询 │ │ │ │ CRUD │ level 1/2/3 │ JDBC方式写文件│ │ │ └──────────────┴──────────────┴──────────────┘ │ │ ┌──────────────┬──────────────┐ │ │ │ SM4加解密 │ AWR报告解读 │ │ │ │ @myCode │ JVM监控 │ │ │ └──────────────┴──────────────┘ │ └──────────────────────────┬──────────────────────────────┘ │ ┌──────────────────────────▼──────────────────────────────┐ │ 数据库(Oracle / MongoDB) │ └─────────────────────────────────────────────────────────┘ 十个决策的统一原则
| 决策 | 原则 |
|---|---|
| 自研 IOC | 只加需要的不加不需要的 |
| 注解路由 + 参数兼容 | 不破坏老系统 |
| 统一入参解析 | 前后端解耦 |
| CGLIB + AOP | 加注解的方式 |
| ASM 参数读取 | 自己的问题自己解决 |
| ThreadLocal 上下文 | 业务层不依赖Servlet |
| MongoDB 混合存储 | 零侵入,渐进式采用 |
| 改 MyBatis 源码分页 | 第一天解决的事用了十几年 |
| Excel 模板报表 | 用业务人员熟悉的工具 |
| Activiti 任意流转 | 不能改变框架时就找到"洞"绕过去 |
一句话:做到实时有据,修改即刻可查。
不追求架构漂亮,不追求技术先进,只追求——出了问题我能从代码快速定位到业务,业务人员能快速进入查到数据。
这个框架没有 Spring 的依赖注入,没有 MyBatis-Plus 的包装,但这是它的一个优点:每一行代码我都能说清来龙去脉,任何问题我都能从入口一步步追踪到数据库。
如果这些文章对你有启发,欢迎点赞收藏评论。如果写得不对,也请指正。毕竟是自己的框架,难免有个人偏见,欢迎在评论区讨论。
系列导航:
- [系列文1:为什么放弃成熟的Spring,我偏要手写轻量IOC容器?]
- [系列文2:新老代码共存的终极解法——注解路由+参数路由平滑迁移]
- [系列文3:前后端彻底解耦!统一入参解析,前端只发JSON,后端随意]
- [系列文4:轻量AOP落地!CGLIB代理+责任链,搞定事务日志监控]
- [系列文5:解决Java编译痛点!ASM字节码直读,100%获取方法参数名]
- [系列文6:ThreadLocal上下文管理,让业务层彻底告别HttpServletRequest]
- [系列文7:零侵入提升查询性能!MongoDB混合存储,不用Redis也能抗]
- [系列文8:改MyBatis源码1行,搞定Oracle物理分页,避开硬解析大坑]
- [系列文9:政务报表自由!Excel模板驱动,业务人员改格式,开发零参与]
- [系列文10:突破Activiti限制!政务工作流任意流转,支持跳退回退]
作者:许彰午 | 非科班野生程序员,深耕政务信息化20年
标签: #Java #自研框架 #IOC #AOP #MyBatis #MongoDB #Activiti #政务信息化 #架构设计 #技术复盘