跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

18 年政务系统实战:Java 自研框架架构决策复盘

政务信息化领域深耕 20 年,基于真实生产环境沉淀出一套轻量稳定的 Java 自研 Web 框架。该框架支撑省级新农保及跨省医保结算等核心民生系统,稳定运行 18 年。核心架构围绕业务痛点打磨,放弃流行全家桶,实现无侵入、可演进。涵盖手写 IOC 容器、注解与参数路由平滑迁移、统一入参解析、CGLIB 轻量 AOP、ASM 字节码参数读取、ThreadLocal 上下文管理、MongoDB 混合存储、MyBatis 物理分页优化、Excel 模板驱动报表及 Activiti 工作流任意流转等十大关键决策。强调实时有据、修改可查,确保问题快速定位至业务与数据层面,适合部署受限及高可靠要求的政务企业级开发场景。

王初壹发布于 2026/4/10更新于 2026/9/1069 浏览
18 年政务系统实战:Java 自研框架架构决策复盘

深耕政务信息化 20 年,这套自研 Java Web 框架支撑了省级新农保、全国跨省医保结算等核心民生系统,稳定运行 18 年。本复盘不讲空泛理论,只聚焦真实生产环境下的架构决策、踩坑经历与落地方案,不求优雅,但求能跑、能扛、能维护。

在长期维护政务系统的过程中,逐渐形成一套轻量、稳定、无侵入、可长期演进的架构思路。这套框架没有依赖流行全家桶,而是围绕业务痛点一点点打磨,最终支撑了海量高并发、高可靠的民生业务。核心决策主要围绕以下十个方面展开:

  1. 放弃 Spring,手写轻量 IOC 容器:通过自定义注解 @bean、@property、@responseMapping 配合 BeanFactory,搞定实例化、注入与路由注册,适用于部署环境受限场景。
  2. 注解路由 + 参数路由,实现新老代码平滑迁移:在路由分发逻辑中先走注解路由,找不到再走老的 Business/Action 参数路由,确保系统迭代升级时不中断服务。
  3. 统一入参解析,前后端彻底解耦:根据方法签名自动转换参数类型,DataCenter、Dao、List、HttpServletRequest 都能自动识别,前端统一 POST JSON,后端方法签名随意定义。
  4. CGLIB + 责任链实现轻量 AOP:利用 doProxy + proxyFilter + 责任链模式,通过 @Trans、@Logger、@monitoring 注解即可处理事务、日志与监控,横切关注点不侵入业务代码。
  5. ASM 字节码直读,100% 获取方法参数名:使用 ASM 直接读取 class 文件字节码,从 LocalVariableTable 获取参数名,解决编译时不加 -parameters 也能拿到真实参数名的痛点。
  6. ThreadLocal 上下文管理,业务层彻底告别 Http:继承 ThreadLocal 的 AppContextContainer 在 Servlet 层绑定用户、连接等信息,业务层随时取用,不再依赖 Servlet API。
  7. MongoDB 混合存储,零侵入提升查询性能:在 Dao 上配置 level 属性(1=双写、2=纯 MongoDB+ 异步同步、3=纯关系库),由 DBUtil 自动路由,无需引入 Redis/MQ 也能抗住缓存需求。
  8. 修改 MyBatis 源码 1 行,搞定 Oracle 物理分页:PaginationInterceptor 用绑定变量 ? 做分页而非拼接 SQL,配合 OracleDialect/MSsqlDialect 方言,避开硬解析大坑。
  9. Excel 模板驱动政务报表,业务人员直接改格式:一个 Servlet 通吃所有报表,Excel 文件即模板,jxl 读数据转 PDF 预览,解决报表格式频繁变动导致开发反复改代码的问题。
  10. Activiti 工作流任意跳转、回退:运行时动态修改流程定义的连线,跳转到任意节点,完成后恢复原状,满足政务审批需要自由跳转、回退、转办的灵活场景。

框架全景图

┌─────────────────────────────────────────────────────────┐
│ 前端层                                                  │
│ browise RIA 框架(基于 Dojo 封装)                       │
│ DataCenter /    序列化                    

                             

 route.java(唯一                               
           
  登录校验      路由分发      异常处理               
           

                           

  容器)                                  
  实例化  注入  代理               
  代理  责任链模式                                  
  事务  日志  监控                

                           

 业务层( 路由)                          
                         

                           

  层)                                        
           
          缓存  通用查询               
            level     方式写文件          
           
                         
   加解密     报告解读                         
          监控                             
                         

                           

 数据库(                                

DataStore
/
JSON
│
└──────────────────────────┬──────────────────────────────┘
│
POST
JSON
┌──────────────────────────▼──────────────────────────────┐
│
Servlet)
│
│
┌──────────────┬──────────────┬──────────────┐
│
│
│
│
│
│
│
│
└──────────────┴──────────────┴──────────────┘
│
└──────────────────────────┬──────────────────────────────┘
│
┌──────────────────────────▼──────────────────────────────┐
│
BeanFactory(IOC
│
│
@bean
@property
@aoppoint
│
│
CGLIB
+
│
│
@Trans
@Logger
@monitoring
│
└──────────────────────────┬──────────────────────────────┘
│
┌──────────────────────────▼──────────────────────────────┐
│
@responseMapping
│
│
Control
→
Service
→
Mapper(MyBatis)
│
└──────────────────────────┬──────────────────────────────┘
│
┌──────────────────────────▼──────────────────────────────┐
│
DBUtil(ORM
│
│
┌──────────────┬──────────────┬──────────────┐
│
│
│
MyBatis
│
MongoDB
│
│
│
│
│
CRUD
│
1
/2/
3
│
JDBC
│
│
│
└──────────────┴──────────────┴──────────────┘
│
│
┌──────────────┬──────────────┐
│
│
│
SM4
│
AWR
│
│
│
│
@myCode
│
JVM
│
│
│
└──────────────┴──────────────┘
│
└──────────────────────────┬──────────────────────────────┘
│
┌──────────────────────────▼──────────────────────────────┐
│
Oracle
/
MongoDB)
│
└─────────────────────────────────────────────────────────┘

十个决策的统一原则

决策原则
自研 IOC只加需要的不加不需要的
注解路由 + 参数兼容不破坏老系统
统一入参解析前后端解耦
CGLIB + AOP加注解的方式
ASM 参数读取自己的问题自己解决
ThreadLocal 上下文业务层不依赖 Servlet
MongoDB 混合存储零侵入,渐进式采用
改 MyBatis 源码分页第一天解决的事用了十几年
Excel 模板报表用业务人员熟悉的工具
Activiti 任意流转不能改变框架时就找到"洞"绕过去

一句话:做到实时有据,修改即刻可查。

不追求架构漂亮,不追求技术先进,只追求出了问题我能从代码快速定位到业务,业务人员能快速进入查到数据。这个框架没有 Spring 的依赖注入,没有 MyBatis-Plus 的包装,但这是它的一个优点:每一行代码我都能说清来龙去脉,任何问题我都能从入口一步步追踪到数据库。

目录

  1. 框架全景图
  2. 十个决策的统一原则

更多推荐文章

查看全部
  • VS Code 中使用 Docker 容器进行开发
  • OpenClaw Session 机制详解:重置、压缩、剪枝与记忆管理
  • 国内主流 AI 工具对比:豆包、元宝、千问、Kimi 等七款模型
  • MySQL Workbench 导入 SQL 文件操作指南
  • Java 模拟算法实战:LeetCode 经典题解
  • 使用 Continue 插件本地部署 AI 代码助手替代 Cursor 或 Copilot
  • 基于 YOLOv12 的无人机航拍视角目标检测系统
  • Kafka 架构详解:高吞吐分布式消息系统设计
  • OpenClaw 安装与飞书机器人接入完整教程
  • Llama-3.2-3B 本地部署与 FlashAttention 加速实测
  • C++ 排序算法核心解析与 STL 实战
  • 8 篇必读的大模型论文精选
  • MobaXterm 连接远程 Linux 服务器图形化界面
  • Go Web 核心原理:Handler 与 ServerMux 深度解析
  • Flutter shelf_modular 鸿蒙化适配指南及路由治理实战
  • 基于 LazyLLM 框架构建自动化财报分析 Agent
  • 数据结构入门:基于数组的栈实现详解
  • GDB 调试与 Core Dump 段错误排查指南(Linux/C/C++)
  • Web 可访问性最佳实践:构建人人可用的前端界面
  • 贪心算法(Greedy Algorithm)核心原理与实现

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online