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

AI三分钟第1弹|3分钟学会给Cursor配置代理

AI三分钟第1弹|3分钟学会给Cursor配置代理 文章目录 * AI三分钟第1弹|3分钟学会给Cursor配置代理 * 正文 * 拿去用 * 讲清楚 * 记住它 * 结语 * 引用 * 版权信息 什么是AI三分钟? 《AI三分钟》专栏旨在提供短小精悍的AI工具使用技巧或者知识 在这个时间碎片化、知识碎片化的时代 用最精炼的语言和最生动的故事 3分钟完成一项干货的科普 正文 拿去用 方法一:直接用博主的配置文件(推荐) 1. 打开Cursor,按 Cmd + Shift + P(Mac)或 Ctrl + Shift + P(Windows)打开检索框 2. 重启Cursor使代理设置生效 3. 点击下图中的首选项,选择Cursor首选项配置,进入network(网络管理)页面 将HTTP协议改成HTTP1.1 粘贴博主编辑好的配置(全部覆盖,覆盖前请自行备份之前的用户设置)

【程序员副业指南】KwaiKAT AI制作小红薯[特殊字符]卡片MCP

【程序员副业指南】KwaiKAT AI制作小红薯[特殊字符]卡片MCP

【程序员副业指南】KwaiKAT AI制作小红薯卡片MCP 【程序员副业指南】KwaiKAT AI制作小红薯📕卡片MCP 背景 每个程序员都熟悉计算机,是最适合写技术博客以及做分享的人。最近发现了一个Markdown转知识卡片,值得注意的是,可以利用这个快速制作小红薯📕卡片,但是有点小贵,对于我这样的白嫖党,那肯定是负担不起的,于是决定利用KAT-Coder-Pro V1复刻一个小红薯📕卡片MCP。 效果展示 本项目已开源:https://github.com/lfrbmw/Little-Red-Book-Card-MCP 有朋友问这个有什么用,最近来看效果,你的到一个可以直接发的小红📕卡片,示例如下,直接输出一张可发布小红书的笔记,还提供多个样式。 相关介绍 为什么选择 KAT-Coder-Pro V1? 🔥 高性能,高性价比 * SWE-Bench Verified 解决率达 73.4%,媲美全球顶尖闭源模型 * 256K 超长上下文,轻松处理项目级代码与复杂任务 * 支持

视频分析神器:让AI帮你5分钟看懂1小时视频内容

视频分析神器:让AI帮你5分钟看懂1小时视频内容 【免费下载链接】video-analyzerA comprehensive video analysis tool that combines computer vision, audio transcription, and natural language processing to generate detailed descriptions of video content. This tool extracts key frames from videos, transcribes audio content, and produces natural language descriptions of the video's content. 项目地址: https://gitcode.com/

一句话生成PCB?和AI聊聊天,就把板子画了!

一句话生成PCB?和AI聊聊天,就把板子画了!

在键盘上敲下一句“我要一个STM32的电机驱动板,带CAN总线”,几秒后,一张完整的原理图和PCB布局在你眼前展开——这不是科幻电影,而是AI给硬件工程师带来的真实震撼。 清晨的阳光洒进办公室,资深硬件工程师李工没有像往常一样直接打开Altium Designer。他对着电脑屏幕上的对话框,敲入了一行简单的需求描述:“设计一个基于ESP32的智能插座PCB,要求支持Wi-Fi控制、过载保护,尺寸尽量小巧。” 15分钟后,一份完整的原理图草案、经过初步优化的双层板布局,甚至是一份物料清单(BOM)初稿已经呈现在他面前。这不可思议的效率背后,正是AI驱动的PCB设计工具在重新定义电子设计的边界。 01 效率革命,从对话到电路板 如今的PCB设计领域正经历着一场静悄悄的革命。传统上,一块电路板从概念到图纸,需要工程师经历需求分析、器件选型、原理图绘制、布局布线等一系列复杂工序,耗时数天甚至数周。 AI工具的出现彻底改变了这一流程。这类工具的核心是经过海量电路数据和设计规则训练的大型语言模型,它们能理解自然语言描述的需求,自动完成从逻辑设计到物理实现的全流程或关键环节。 比如,当