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

WIN11必备!QTTabBar中文优化版保姆级安装教程(含常见问题解决)

WIN11效率革命:深度定制你的资源管理器,不止于多标签 如果你和我一样,每天要在Windows的资源管理器里花费大量时间,那你一定对那种反复在层层文件夹中穿梭、找不到上一个窗口的体验深恶痛绝。系统自带的文件管理工具,就像一个功能简陋的毛坯房,勉强能用,但毫无效率与舒适度可言。尤其是升级到WIN11后,虽然界面更现代,但核心的文件管理逻辑依然停留在上个时代,对于追求效率的用户来说,这无疑是一种巨大的生产力损耗。 这篇文章,就是为那些不愿忍受现状,但又不想投入过多精力去学习复杂新软件的WIN10/WIN11用户准备的。我们不讨论那些需要彻底改变操作习惯的“重型”第三方管理器,而是聚焦于一种更优雅、更无感的解决方案:增强你正在使用的资源管理器本身。今天的主角,是一个经过国内开发者精心“魔改”的经典工具——QTTabBar的中文优化版。它就像给你的文件管理器做了一次精装修,保留了熟悉的格局,却赋予了它全新的、高效的能力。接下来,我将带你从零开始,完成这次效率升级,并深入探讨如何根据你的习惯,将它调校成最趁手的工具。 1. 为什么选择增强,而非替换? 在深入安装细节之前,我们有必要先

Java Web HTML问卷调查系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

Java Web HTML问卷调查系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 随着互联网技术的快速发展,在线问卷调查系统已成为企业、教育机构和政府部门收集数据的重要工具。传统的纸质问卷调查方式效率低下,数据统计和分析过程繁琐,而基于Web的问卷调查系统能够实现问卷的快速创建、分发和数据分析,显著提升工作效率。此外,现代用户对系统的交互体验和响应速度提出了更高要求,因此开发一个高效、稳定且用户友好的在线问卷调查系统具有重要的现实意义。关键词:问卷调查系统、Web应用、数据收集、效率提升、用户交互。 本系统采用前后端分离架构,后端基于SpringBoot2框架搭建,结合MyBatis-Plus实现高效数据库操作,MySQL8.0作为数据存储方案,确保系统的高性能和可扩展性。前端使用Vue3框架开发,利用其响应式特性和组件化设计提升用户体验。系统核心功能包括问卷创建、问题管理、用户权限控制、数据统计与可视化分析等,同时支持多终端适配,满足不同场景下的使用需求。关键词:SpringBoot2、Vue3、MyBatis-Plus、MySQL8.0、前后端分离、数据可视化。 数据表设计 问卷信息数据表 问卷信息数据表用于存储用户创建的问卷基本信息,包括标题、

Python爬虫实战:高效解析Web of Science文献数据并导出CSV

1. 从零开始:为什么科研人员需要掌握Python爬虫 如果你是一名研究生、博士生,或者正在从事学术研究,我猜你一定有过这样的经历:为了写一篇综述或者做文献计量分析,你需要手动从Web of Science(WoS)上,一篇一篇地复制粘贴文献的标题、作者、摘要、关键词、发表年份、期刊信息……这个过程不仅枯燥乏味,而且极其容易出错,复制到第50篇的时候,你可能已经头晕眼花,甚至怀疑人生了。我当年读博的时候,为了分析一个领域近十年的研究趋势,需要收集上千篇文献数据,手动操作几乎是不可能完成的任务。正是这种“痛点”,让我下定决心研究如何用技术解放双手。 Python爬虫,听起来像是程序员专属的高深技术,但其实它离我们科研人员并不遥远。简单来说,爬虫就是一个能自动访问网页、抓取并整理信息的程序。对于Web of Science这样的学术数据库,虽然它提供了强大的检索功能,但批量导出详细数据(尤其是摘要、作者机构等)到本地进行深度分析,往往需要付费或者功能受限。自己写一个爬虫,就成了最高效、最灵活的解决方案。它能让你在喝杯咖啡的功夫,

LangChain 实战:大模型对话记忆模块(附完整代码 + Web 案例)

目录 前言:为什么需要对话记忆? 一、核心认知:原始 API vs LangChain 封装 1.1 原生 API 调用的痛点(无记忆) 1.2 LangChain 的价值:封装记忆与简化调用 二、LangChain 记忆模块核心组件 2.1 基础款:ConversationBufferMemory(完整记忆) 2.2 进阶款:窗口记忆与总结记忆 (1)ConversationBufferWindowMemory(窗口记忆) (2)ConversationSummaryMemory(总结记忆) 三、实战 1:LangChain 记忆链(ConversationChain) 四、实战 2:Streamlit 搭建带记忆的聊天