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

突破机器人通讯架构瓶颈,CAN/FD、高速485、EtherCAT,哪种总线才是最优解?

突破机器人通讯架构瓶颈,CAN/FD、高速485、EtherCAT,哪种总线才是最优解?

引言: 从协作机械臂到人形机器人,一文拆解主流总线技术选型困局 在机器人技术飞速发展的今天,从工厂流水线上的协作机械臂到科技展会上的人形机器人,它们的“神经系统”——通讯总线,正面临着前所未有的挑战。特斯拉Optimus的精准动作、波士顿动力Atlas的流畅跑跳,背后都是海量数据的高速交互。 然而,许多工程师在项目初期都会陷入同一个困境:面对RS485、CAN/CAN FD、EtherCAT等多种总线方案,究竟该如何选择? 本文将从机器人类型与需求分析出发,深入剖析三大主流总线技术的优劣,不提供“标准答案”,只提供一套科学的选择方法论。 一、机器人类型与通讯需求拆解 不同机器人的自由度、运动复杂度和性能要求,直接决定了其通讯总线的选择方向。下图概括了三种典型机器人的通讯需求与方案选择: 1. 低自由度/轻量型机器人(6-12自由度) 典型代表:协作机械臂、AGV小车、桌面级教育机器人。 核心需求:成本敏感、可靠性、易于集成、适度实时性(毫秒级)。这类机器人节点数相对较少,数据量不大,但对性价比要求极高。 现有主流方案:CAN

教你一步步在 服务器/本地(Linux/Windows) 部署鸣潮QQ机器人,并将其接入大语言模型,实现通过机器人进行库街区签到、练度查询、攻略查询等功能 (1)

准备工作 一台轻量级服务器/ 本地windows/linux能够在服务器/本地 科学上网 环境部署 笔者所演示的环境为阿里云服务器(2核CPU,2GIB内存,40GIB系统盘),操作系统为 Ubuntu 24.04. 确保已成功安装Python环境(版本须>3.8, 建议>=3.12,不建议>=3.13) 确保已成功安装git 如果你没有安装git且的系统是ubuntu,安装git只需要输入 如果系统为Windows,则自行前往 🔗官网 下载安装包安装即可 创建虚拟环境 从 Python 3.11 开始,Debian 和 Ubuntu 默认启用了 "Externally-Managed-Environment"(外部管理环境)保护机制,

Flutter 三方库 ethereum_addresses 的鸿蒙化适配指南 - 掌控区块链地址资产、精密校验治理实战、鸿蒙级 Web3 专家

Flutter 三方库 ethereum_addresses 的鸿蒙化适配指南 - 掌控区块链地址资产、精密校验治理实战、鸿蒙级 Web3 专家

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 ethereum_addresses 的鸿蒙化适配指南 - 掌控区块链地址资产、精密校验治理实战、鸿蒙级 Web3 专家 在鸿蒙跨平台应用执行高级区块链身份管理与多维以太坊地址资产指控(如构建一个支持全场景秒级交互的鸿蒙大型全量钱包中枢、处理海量 Ethereum Address Payloads 的语义认领或是实现一个具备极致指控能力的资产管理后台地址审计中心)时,如果仅仅依赖官方的基础 Regular Expression 或者是极其繁琐的手动 Checksum 计算,极易在处理“由于大小写敏感导致的资产认领偏移”、“高频地址校验下的认领假死”或“由于多语言环境导致的符号解析冲突死结”时陷入研发代码区块链逻辑崩溃死循环。如果你追求的是一种完全对齐现代 Ethereum 标准、支持全量高度可定制校验(Type-safe Web3)且具备极致指控确定性的方案。今天我们要深度解析的 ethereum_addresses——一个专注于解决“地址

本地AI电话机器人-将手机电话通话声音通过udp传输到局域网的Python脚本

本地AI电话机器人-将手机电话通话声音通过udp传输到局域网的Python脚本

将手机电话通话声音通过udp传输到局域网的Python脚本 --本地AI电话机器人 * 一、前言 上一篇:手机转SIP-手机做中继网关-落地线路对接软交换呼叫中心下一篇:刷抖音/看电子书-如何让手机自动上下翻页和左右翻页 前面我们通过两个篇章《手机SIM卡通话中随时插入录音语音片段(Android方案)》《手机SIM卡通话中随时插入录音语音片段(Windows方案)》,阐述了【手机打电话过程中,随机插播预录语音片段】的功能和根据对方手机按下DTMF按键,播放不同IVR应答语音片段给对方手机的能力。 在AI电话沟通时,由于手机性能和算力的局限性,通常AI交互的模型和算法无法部署到手机上。这样的话就需要将拦截到的手机通话的声音数据,通过网络(局域网或互联网)将语音包传输给AI算力服务器。由其对语音进行ASR识别和语义理解,并生成最终的应答TTS语音,反馈回手机注入到电话通话中。 当前市面上主流的实时语音流的传输方式主要有两种: 1)SIP/WebRTC协议及配套的RTP/RTCP语音数据传输。 2)直接将语音数据以udp广播或组播的方式分发给局域网内多个设备。 前面我们