Spring 全家桶、ORM、缓存、RPC、定时任务、网关、测试、日志、权限等
1. Spring MVC vs Spring WebFlux
表格
| 对比维度 | Spring MVC | Spring WebFlux |
|---|---|---|
| 编程模型 | 同步阻塞 Servlet 模型 | 异步响应式 Reactor/Netty 非阻塞 |
| 底层容器 | Tomcat/Jetty Servlet 容器 | Netty 异步服务器,也可兼容 Servlet |
| 线程模型 | 一线程一请求,阻塞 IO | 少量线程处理大量并发连接 |
| 阻塞 API 适配 | 完美适配 JDBC、同步 RPC | 同步阻塞 IO 会耗尽有限线程池 |
| 适用场景 | 传统 CRUD、同步数据库业务、中小并发 | 高并发网关、大量长连接、流式推送 |
| 学习成本 | 低,Java 开发者通用习惯 | 高,需掌握响应式编程、背压 |
2. MyBatis vs MyBatis-Plus
表格
| 对比维度 | 原生 MyBatis | MyBatis-Plus(MP) |
|---|---|---|
| CRUD 能力 | 仅基础 SQL 映射,通用增删改查需手写 XML | 内置 BaseMapper,单表无 SQL 即可 CRUD |
| 分页功能 | 手动编写分页 SQL、分页参数封装 | 内置分页插件,自动分页、count 优化 |
| 条件构造器 | 无,全部依赖 XML / 注解 SQL | Lambda QueryWrapper,防硬编码字段名 |
| 逻辑删除、自动填充 | 需自行封装拦截器 | 开箱即用配置,自动填充创建人 / 时间 |
| 多表关联 | 原生友好,XML 灵活多表 join | 多表弱支持,复杂关联建议手写 XML |
| 版本兼容 | 独立框架,无 Spring 绑定 | 基于 MyBatis 二次封装,无缝兼容 SpringBoot |
3. MyBatis vs JPA(Hibernate)
表格
| 对比维度 | MyBatis | Spring Data JPA (Hibernate 底层) |
|---|---|---|
| SQL 控制权 | 完全手写 SQL,高度可控,优化方便 | 自动生成 SQL,复杂 SQL 难调优 |
| 学习门槛 | 中等,熟悉 SQL 即可上手 | 高,需理解实体映射、持久态、一级缓存 |
| 多表复杂查询 | 优势明显,XML 自由拼接关联 | 复杂 join、子查询代码繁琐 |
| 快速开发 | 单表重复 CRUD 模板代码多 | 单表零 SQL,快速实现基础业务 |
| 数据库迁移 | 无自动 DDL,适配多库无兼容坑 | 自动建表,不同数据库方言易出现字段差异 |
| 性能调优 | SQL 可见,慢 SQL 快速定位 | 自动生成 SQL,隐性全表查询难排查 |
4. Spring Data Redis vs Jedis
表格
| 对比维度 | Spring Data Redis | 原生 Jedis |
|---|---|---|
| 封装程度 | 高度封装,Template 工具类 | 原生 Redis 命令 API,无封装 |
| 连接池管理 | 自动集成 Lettuce/Jedis 连接池 | 需手动配置连接池、资源释放 |
| 序列化方案 | 内置 Jackson、Jdk 序列化,可自定义 | 仅字符串 / 字节操作,序列化自行实现 |
| 响应式支持 | Lettuce 底层支持 Reactor 响应式 | Jedis 仅同步阻塞 |
| SpringBoot 适配 | 自动配置,yml 一键配置 | 需手动创建 JedisPool、销毁资源 |
| 分布式锁 | 无内置工具,自行封装 | 无分布式锁工具类 |
5. Lettuce vs Jedis(Redis 客户端)
表格
| 对比维度 | Lettuce | Jedis |
|---|---|---|
| IO 模型 | Netty 异步非阻塞,线程安全 | 同步阻塞,多线程需多连接 / 池 |
| 连接复用 | 单个连接可多线程共享 | 多线程共用同一连接会线程不安全 |
| 资源开销 | 长连接,少量连接支撑大量并发 | 高并发需大量连接,占用端口 |
| 响应式 API | 原生支持 Reactor 异步调用 | 仅同步阻塞接口 |
| 事务 / 管道 | 支持异步 pipeline 事务 | 同步管道、事务 |
| SpringBoot 默认 | SpringBoot2.x 默认客户端 | SpringBoot1.x 老版本默认 |
6. Dubbo vs Spring Cloud OpenFeign
表格
| 对比维度 | Dubbo | OpenFeign(SpringCloud) |
|---|---|---|
| 通信协议 | 自定义 Dubbo 二进制协议,高效 | HTTP/JSON 通用协议 |
| 注册中心 | Nacos/Zookeeper/Apollo | Nacos/Eureka/Consul |
| 负载均衡 | 内置多种均衡、权重灰度 | 依赖 SpringCloud LoadBalancer |
| 性能 | 二进制序列化,吞吐量高,延迟低 | HTTP 报文头大,性能弱于 Dubbo |
| 跨语言 | 仅 Java 生态友好,跨语言差 | HTTP 标准,支持所有开发语言 |
| 网关适配 | 配套 Dubbo 网关 | 适配 Spring Cloud Gateway |
7. Spring Cloud Gateway vs Zuul1
表格
| 对比维度 | Spring Cloud Gateway | Zuul 1.x |
|---|---|---|
| 底层线程 | Netty 异步非阻塞,响应式 | 同步 Servlet 阻塞一线程一请求 |
| 并发能力 | 支持高并发、长连接、流式推送 | 并发量高时线程耗尽,性能瓶颈 |
| 过滤器模型 | GlobalFilter、路由过滤器灵活链式 | Pre/Post 简单过滤器,拓展弱 |
| Spring 版本 | SpringBoot2、WebFlux 原生适配 | 仅 SpringBoot1 兼容,已停止维护 |
| 内置功能 | 限流、熔断、重写路径内置 | 需手动整合 Hystrix 限流熔断 |
| 性能 | 高并发场景吞吐量是 Zuul 数倍 | 中小并发可用,大流量不推荐 |
8. Nacos vs Eureka(注册配置中心)
表格
| 对比维度 | Nacos | Eureka |
|---|---|---|
| 核心能力 | 注册中心 + 分布式配置中心二合一 | 仅服务注册发现,无配置管理 |
| 一致性算法 | AP+CP 切换,支持持久化 | 纯 AP 设计,保证可用性,无强一致 |
| 权重灰度 | 原生支持权重、灰度路由 | 无原生灰度,需自行拓展 |
| 持久化 | MySQL 持久化实例、配置信息 | 内存存储,重启数据丢失 |
| 监控告警 | 内置服务健康监控、推送变更 | 仅基础健康检查,无推送机制 |
| 生态适配 | Dubbo、SpringCloud 双生态兼容 | 仅 SpringCloud 生态 |
9. Nacos vs Apollo(配置中心)
表格
| 对比维度 | Nacos | Apollo |
|---|---|---|
| 功能范围 | 配置中心 + 注册中心一体 | 专注分布式配置中心,无注册功能 |
| 权限管控 | 基础命名空间权限,简单 | 精细化项目、环境、用户角色权限 |
| 灰度发布 | 简易灰度,按 IP / 权重 | 精准灰度、分批发布、回滚记录完整 |
| 存储介质 | MySQL 存储配置 | 多数据库分层存储,隔离性更强 |
| 变更推送 | 长连接实时推送配置变更 | 长连接推送,推送日志完整审计 |
| 运维复杂度 | 部署简单,单服务启动 | 组件多(Portal/Admin/Config)运维成本高 |
10. Hystrix vs Resilience4j(熔断降级)
表格
| 对比维度 | Hystrix | Resilience4j |
|---|---|---|
| 维护状态 | Netflix 停止维护,不再更新 | 持续活跃更新,SpringCloud2 主推 |
| 底层依赖 | RxJava1 老旧版本 | 基于 Java8 函数式,轻量无重型依赖 |
| 功能组件 | 熔断、限流、降级、隔离舱 | 熔断、限流、重试、超时、信号量隔离 |
| 线程模型 | 独立线程池隔离,开销大 | 信号量隔离为主,资源消耗低 |
| Spring 适配 | SpringCloud1 默认组件 | SpringCloud2 官方推荐,适配 WebFlux |
| 体积 | 依赖包庞大,冗余类多 | 轻量化,极小依赖体积 |
11. Quartz vs XXL-Job(定时任务)
表格
| 对比维度 | Quartz 原生框架 | XXL-Job 分布式定时任务 |
|---|---|---|
| 部署模式 | 单机 / 集群数据库锁,无统一控制台 | 中心化调度平台,Web 可视化控制台 |
| 运维操作 | 代码 / 数据库修改任务,无界面 | 页面新增、启停、重试、日志查看 |
| 分布式防重 | 依赖数据库锁表实现,性能差 | 中心化调度,天然分片、广播任务 |
| 失败策略 | 自行编写失败重试、告警逻辑 | 内置失败重试、邮件 / 钉钉告警 |
| 执行日志 | 需自行记录入库 | 持久化完整执行日志,检索分页 |
| 接入成本 | 原生 API 繁琐,需配置表结构 | SpringBoot 一键 starter,零配置快速接入 |
12. JUnit 4 vs JUnit 5(Jupiter)
表格
| 对比维度 | JUnit4 | JUnit5 |
|---|---|---|
| 架构设计 | 单体耦合框架 | 模块化分层:平台、引擎、API 解耦 |
| 注解体系 | @Test、@Before、@After 老旧注解 | 全新 @BeforeEach、@BeforeAll 等标准化注解 |
| 扩展机制 | 运行 Rule 拓展能力弱 | Extension 强大拓展模型,替代 Rule |
| Java 版本 | 兼容 Java5+ | 最低 Java8,支持 Lambda、流式断言 |
| 参数化测试 | 第三方依赖 | 原生内置参数化测试 |
| Spring 整合 | SpringTest 老旧适配 | Spring 6 原生深度适配,支持 WebFlux 测试 |
13. Logback vs Log4j2(日志框架)
表格
| 对比维度 | Logback | Log4j2 |
|---|---|---|
| 性能 | 同步日志性能优秀,轻量 | 异步零垃圾 GC,高并发吞吐量更高 |
| 依赖关系 | Slf4j 原生实现,作者同源 | 独立实现,桥接适配 Slf4j |
| 配置文件 | xml/groovy 简洁配置 | xml/json/yaml 多格式,插件丰富 |
| 异步模型 | 阻塞队列异步 | 无锁 RingBuffer 异步,低延迟 |
| 内存开销 | 轻量,低内存占用 | 高并发场景内存优化更好 |
| 漏洞风险 | 历史无高危远程漏洞 | 旧版存在远程代码执行漏洞,需升级 |
14. Spring Security vs Shiro(权限框架)
表格
| 对比维度 | Spring Security | Apache Shiro |
|---|---|---|
| Spring 适配 | Spring 全家桶原生深度集成 | 兼容 Spring,适配度弱于 Security |
| 功能完整性 | OAuth2、OIDC、RBAC、会话管理一体化 | 基础认证授权,OAuth 需自行拓展 |
| 并发会话控制 | 原生踢人、在线会话管控 | 会话管理需手动封装 |
| 学习成本 | 高,大量过滤器链概念 | 低,API 简洁易懂,上手快 |
| 前后端分离 | 原生支持 Token、JWT 适配 | 无原生 JWT,需自定义过滤器 |
| 性能 | 过滤器链路多,轻微损耗 | 轻量,拦截链路简单 |
15. JWT vs Session(前后端认证)
表格
| 对比维度 | JWT 无状态令牌 | 服务端 Session 会话 |
|---|---|---|
| 存储位置 | 全部信息存储客户端 Token | 会话数据存储服务端内存 / Redis |
| 分布式 | 天然分布式,无需共享存储 | 分布式需 Redis 共享 Session |
| 过期控制 | Token 内置过期时间,无法主动失效 | 服务端可手动销毁会话、踢下线 |
| 带宽消耗 | 每次请求携带完整载荷,报文更大 | 仅传输简短 SessionId,体积小 |
| 数据安全 | 载荷明文存储敏感信息不可放 | 敏感数据存在服务端,更安全 |
| 刷新机制 | 需单独刷新 Token 接口 | 服务端自动续期,无需额外接口 |
16. Elasticsearch vs Redis(检索缓存)
表格
| 对比维度 | Elasticsearch | Redis |
|---|---|---|
| 核心定位 | 全文检索、复杂聚合分析 | 内存 KV 高速缓存、临时存储 |
| 查询能力 | 分词、模糊、范围、聚合、分组 | 仅简单 key/Hash/ZSet 基础查询 |
| 持久化 | 磁盘持久化,海量数据存储 | RDB/AOF 持久化,不适合亿级海量文本 |
| 写入延迟 | 磁盘写入,延迟相对高 | 纯内存操作,读写纳秒级延迟 |
| 分片扩容 | 原生分布式分片集群 | Redis Cluster 分片集群,仅 KV 分片 |
| 适用场景 | 日志检索、商品模糊搜索、报表统计 | 热点缓存、分布式锁、限流计数器 |
17. RabbitMQ vs Kafka(消息中间件)
表格
| 对比维度 | RabbitMQ | Apache Kafka |
|---|---|---|
| 底层模型 | 交换机、队列、绑定,灵活路由 | 分区日志流模型,简单分区存储 |
| 吞吐量 | 万级吞吐量,适合复杂路由 | 百万级高吞吐,海量日志首选 |
| 可靠性 | 完善生产者 / 消费者确认机制,消息不丢 | 副本同步刷盘保证高可靠 |
| 延迟队列 | 原生支持延迟消息插件 | 无原生延迟,依赖时间轮方案 |
| 消息堆积 | 大量堆积内存暴涨易 OOM | 磁盘顺序存储,百万堆积无压力 |
| 适用场景 | 业务异步通知、订单复杂路由、延迟任务 | 日志采集、大数据流、高吞吐异步解耦 |
18. EasyExcel vs POI(Excel 解析导出)
表格
| 对比维度 | Alibaba EasyExcel | Apache POI |
|---|---|---|
| 内存模型 | 逐行 SAX 流式读取,低内存 | 一次性加载全 Sheet 到内存,大数据 OOM |
| 大数据支持 | 十万 / 百万行无堆溢出风险 | 上万行极易堆内存溢出 |
| API 简洁度 | 极简注解绑定实体,开箱即用 | 大量底层 Workbook/Sheet 模板代码 |
| 性能 | 读写速度快,GC 压力小 | 内存开销大,频繁 GC 卡顿 |
| 功能拓展 | 自定义转换器、合并单元格完善 | 底层功能全面,拓展代码量大 |
| 版本坑 | 版本稳定,坑少 | 旧版存在内存泄漏、公式计算 bug |
19. Hutool vs Guava(工具类)
表格
| 对比维度 | Hutool | Google Guava |
|---|---|---|
| 语言生态 | 国产 Java 全场景工具,贴合国内业务 | Google 开源通用基础工具库 |
| 覆盖范围 | 加密、文件、Excel、验证码、线程池、日期 | 集合、缓存、并发、基础字符串 |
| 中文适配 | 完美支持中文、中文日期、中文加密 | 对中文无特殊优化 |
| 依赖体积 | 整合大量工具,包体积更大 | 轻量化,专注基础底层工具 |
| 更新维护 | 国内持续高频更新,适配国产框架 | 稳定低频更新,API 极少变动 |
| 企业场景 | 中小型业务项目一站式工具 | 底层基础组件、开源中间件通用依赖 |
20. Swagger2 vs Knife4j(接口文档)
表格
| 对比维度 | Springfox Swagger2 | Knife4j (Swagger 增强 UI) |
|---|---|---|
| 底层依赖 | 原生 Swagger 规范实现 | 基于 Swagger OpenAPI 二次封装增强 |
| UI 界面 | 基础简陋页面,无增强功能 | 离线文档、全局搜索、导出 Markdown |
| 认证支持 | 基础 token 参数配置 | 全局认证一键填充,调试更友好 |
| SpringBoot 适配 | 高版本 SpringBoot 存在兼容 bug | 持续更新适配 SpringBoot3、JDK17 |
| 生产防护 | 无原生接口屏蔽配置 | 支持生产环境关闭文档入口 |
| 拓展功能 | 拓展能力弱 | 字典枚举解析、离线文档下载 |
21. Redisson vs 原生 RedisTemplate 分布式锁
表格
| 对比维度 | Redisson | Spring Data RedisTemplate 手动实现锁 |
|---|---|---|
| 锁实现 | 封装 Lua 脚本,可重入锁、读写锁、红锁 | 自行编写 Lua,仅简易互斥锁 |
| 自动续期 | 看门狗自动续期防死锁 | 无自动续期,业务超时直接锁失效 |
| 失效防死锁 | 锁释放兜底,避免宕机永久持有锁 | 宕机则锁永久存在,需设置过期时间 |
| 代码侵入 | 一行 API 获取锁,简洁 | 大量 Lua 脚本、过期时间、释放模板代码 |
| 分布式方案 | 单机锁、主从红锁、集群锁齐全 | 仅支持单机 Redis,集群锁实现复杂 |
22. PageHelper MP 分页 vs 原生 MyBatis 分页
表格
| 对比维度 | PageHelper | MyBatis-Plus 内置分页插件 |
|---|---|---|
| 使用方式 | ThreadLocal 存储分页参数,静态方法 | Lambda 分页参数,绑定 Mapper 查询 |
| 多数据源 | 多数据源需手动清理分页参数 | 多数据源自动隔离,无污染 |
| count 优化 | 支持 countSql 自定义优化 | 自动识别 join,优化 count 语句 |
| Lambda 支持 | 无 Lambda 条件构造器 | QueryWrapper 链式 Lambda 条件分页 |
| 嵌套分页 | 嵌套查询易出现分页错乱 | 多层嵌套分页兼容性更好 |
| 维护状态 | 独立开源分页插件 | MP 内置,随 MP 统一更新维护 |
23. Flyway vs Liquibase(数据库版本管理)
表格
| 对比维度 | Flyway | Liquibase |
|---|---|---|
| 脚本格式 | 原生 SQL 脚本,上手简单 | XML/YAML/JSON/SQL 多格式变更集 |
| 学习成本 | 极低,直接写业务 SQL | 高,需学习专用变更标签语法 |
| 回滚能力 | 仅清理,无精准版本回滚 | 支持指定版本回滚、变更追溯 |
| 复杂 DDL | 原生 SQL 适配所有数据库方言 | 统一语法自动适配多数据库 |
| 企业规范 | 适合中小项目简单版本迭代 | 多环境、多数据库复杂适配大型项目 |
24. SpringDoc OpenAPI3 vs Springfox Swagger2
表格
| 对比维度 | SpringDoc OpenAPI | Springfox Swagger2 |
|---|---|---|
| OpenAPI 规范 | 兼容 OpenAPI3 最新标准 | 仅兼容老旧 OpenAPI2 |
| SpringBoot3/JDK17 | 原生完美支持 | 停止维护,完全不兼容高版本 |
| 注解体系 | 复用 Jakarta 新注解 | 依赖过时 javax 包,高版本报错 |
| 依赖维护 | 持续迭代更新,无兼容 bug | 长期停止更新,大量兼容性问题 |
| 响应类解析 | 自动识别泛型、嵌套 DTO | 泛型、复杂泛型解析失效 |
25. Seata TCC vs AT 模式(分布式事务)
表格
| 对比维度 | Seata AT 模式 | Seata TCC 模式 |
|---|---|---|
| 代码侵入 | 极低,仅 @GlobalTransactional 注解 | 侵入极高,需编写 Try/Confirm/Cancel 三阶段接口 |
| 实现原理 | 自动拦截 SQL 生成 undo_log 回滚日志 | 手动编写资源预留、确认、补偿逻辑 |
| 适配场景 | 普通单库 CRUD、无复杂资源锁定 | 库存冻结、资金预留等强隔离业务 |
| 隔离级别 | 全局读未提交,存在脏读风险 | 自定义隔离逻辑,隔离性可控 |
| 开发速度 | 快速接入,零业务改造 | 开发量大,开发周期长 |
26. Sa-Token vs Spring Security(轻量权限)
表格
| 对比维度 | Sa-Token | Spring Security |
|---|---|---|
| 接入成本 | 极低,yml 简单配置开箱即用 | 大量过滤器、配置类,学习曲线陡 |
| 功能范围 | 登录认证、权限、单点登录、防重放、JWT 一体化 | 认证授权基础能力,单点需整合 OAuth2 |
| 前后端分离 | 原生适配无状态 Token,自动跨域 | 跨域、Token 需大量自定义配置 |
| 依赖体积 | 轻量化,极小第三方依赖 | 依赖 Spring 全家桶,包体积庞大 |
| 微服务 | 原生支持分布式会话、网关鉴权 | 分布式会话需整合 Redis/Session 共享 |
27. Druid vs HikariCP(数据库连接池)
表格
| 对比维度 | Druid 阿里连接池 | HikariCP SpringBoot 默认池 |
|---|---|---|
| 性能优化 | 内置监控、防 SQL 注入过滤器 | 极致轻量化,零开销高性能 |
| 监控面板 | 内置 Web 监控页面,SQL 慢查询统计 | 无内置监控,需自行埋点 |
| 过滤拓展 | 支持 SQL 拦截、防火墙、日志过滤 | 仅基础连接管理,拓展能力弱 |
| 内存占用 | 功能多,内存开销略高 | 极简设计,内存占用极低 |
| 并发性能 | 高并发稳定,防泄漏 | 并发吞吐量业界顶尖,无锁设计 |
| SpringBoot | 需手动引入依赖配置 | Boot2 默认内置,自动装配 |
28. Actuator Spring 监控 vs Prometheus Micrometer
表格
| 对比维度 | Spring Boot Actuator | Micrometer + Prometheus |
|---|---|---|
| 数据输出 | HTTP 端点 JSON 格式 | 标准 Prometheus 指标格式,时序数据库适配 |
| 可视化 | 仅基础端点,无图表展示 | 搭配 Grafana 大盘、告警规则完整监控体系 |
| 指标类型 | 基础 JVM、线程池、HTTP 请求指标 | 计数器、计时器、直方图多维度指标 |
| 告警能力 | 无原生告警机制 | Prometheus AlertManager 配置告警推送 |
| 微服务 | 单机监控为主 | 集群统一指标收集,分布式监控首选 |
29. MapStruct vs BeanUtils(实体转换)
表格
| 对比维度 | MapStruct | Spring BeanUtils / Hutool BeanUtil |
|---|---|---|
| 实现原理 | 编译期生成转换实现类,无反射 | 运行时反射赋值,性能差 |
| 性能 | 接近手动 get/set,无反射损耗 | 大量反射,循环转换 GC 压力大 |
| 类型校验 | 编译期类型不匹配直接报错 | 运行时才抛出转换异常,难以提前发现 |
| 自定义转换 | 注解自定义转换器,编译生效 | 运行时自定义转换器,代码繁琐 |
| 空值处理 | 编译配置全局空值策略 | 运行时空值易空指针,需手动判空 |
30. Canal vs DataX(数据同步中间件)
表格
| 对比维度 | Canal | DataX |
|---|---|---|
| 同步原理 | 监听 MySQL binlog 增量同步 | 全量 / 增量定时读取数据库批量同步 |
| 实时性 | 毫秒级实时数据同步 | 定时任务,分钟级延迟 |
| 数据量 | 适合增量实时同步,增量变更 | 海量全量数据离线迁移,批量导入 |
| 数据源 | 仅适配 MySQL binlog | MySQL/Oracle/ES/FTP 多数据源互相同步 |
| 资源消耗 | 低,仅监听日志无查询压力 | 全量查询占用数据库 IO、CPU |
| 业务场景 | 缓存更新、分库同步、实时数据推送 | 离线数仓同步、历史数据迁移 |

2034

被折叠的 条评论
为什么被折叠?



