0. 总纲|Java Web 自研框架 18 年Java架构决策复盘

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.javaservice() 方法里一套判断逻辑,先走注解路由,找不到再走老的 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 #政务信息化 #架构设计 #技术复盘

Read more

OpenClaw 实战:让 AI 拥有“眼睛“——摄像头访问完全指南

OpenClaw 实战:让 AI 拥有“眼睛“——摄像头访问完全指南

今天冒出个想法,想让openclaw能控制摄像头分析图片。原因是我有本书,网上还没有电子版,想让openclaw分析然后把重点内容讲给我听。 📖让运行在 WSL2 里的 OpenClaw AI 助手能够"看见"摄像头画面。 🚧 探索过程 第一阶段:OpenClaw Node 配对(失败)折腾了 3 小时+,最终因为 WSL2 网络隔离问题放弃。 我在wsl里安了openclaw,他说要控制摄像头,必须在windows上安装node.js,安装npm,折腾了好久,就是报错。结论就是windows和wsl就是隔离的。 具体过程: **安装 Node.js:** 最开始下载了绿色版 Node.js(v24.14.0),遇到了一系列问题: ```powershell # 绿色版 Node.js

2026年最新全球AI大模型深度研究报告

2026年最新全球AI大模型深度研究报告 文章目录 * 2026年最新全球AI大模型深度研究报告 * 摘要 * 第一章 全球AI大模型发展概况 * 1.1 全球AI发展格局:中美双极引领 * 1.2 市场规模与增长趋势 * 1.3 发展阶段特征 * 第二章 核心技术突破分析 * 2.1 主流大模型最新进展 * 2.1.1 美国阵营 * 2.1.2 中国阵营 * 2.2 核心技术突破方向 * 2.2.1 多模态能力 * 2.2.2 长上下文处理 * 2.2.3 推理能力 * 2.2.4 Agent能力 * 2.2.

用 OpenClaw 配置 Codex 5.3:一套“性价比很高”的个人 AI 编程方案

用 OpenClaw 配置 Codex 5.3:一套“性价比很高”的个人 AI 编程方案

这篇是我自己的实战复盘:从 OAuth 报错、模型没切过去,到最终把 OpenClaw 稳定跑在 openai-codex/gpt-5.3-codex 上,并通过飞书远程使用。 先说结论 如果你也在找「便宜 + 强 + 可控」的方案,我现在这套组合非常能打: * OpenClaw 负责 Agent 编排(工具、文件、会话、渠道) * OpenAI Codex 5.3 负责核心编码能力 * Feishu 作为消息入口(随时远程下指令) * 本地 Workspace 放在 G:\claw,项目资产可控 这套的性价比点在于: 1. 不需要重搭一整套复杂平台 2. Codex 5.3 编码质量明显高于普通通用模型

顶级AI公司Anthropic出现爆炸级事故!!!震惊!Claude Code 源码意外泄露:Anthropic “被动开源”

顶级AI公司Anthropic出现爆炸级事故!!!震惊!Claude Code 源码意外泄露:Anthropic “被动开源”

🔥🔥🔥震惊!Claude Code 源码意外泄露:Anthropic “被动开源” 昨天(2026年3月31日),AI 圈发生了一件堪称“年度大戏”的事件:Anthropic 旗下的热门 AI 编程工具 Claude Code 的完整源代码意外泄露了! 传送门: https://github.com/instructkr/claude-code 这不是黑客入侵,也不是安全漏洞被利用,而是一次低级却致命的发布配置失误。Anthropic 在推送 npm 包 @anthropic-ai/claude-code 版本 2.1.88 时,不小心把一个 59.8MB 的 source map 文件(cli.js.map) 打包了进去。