知其然,知其所以然
Spring 全家桶 2026-10-23

Could not resolve placeholder:占位符找不到的几种原因

实测 Spring Boot 4.0.8 的 Could not resolve placeholder:没定义、key 拼错、配置文件名错、profile 没激活四种原因报错完全一样;默认值写法与空格;嵌套占位符与引用链报错;@Value 与 relaxed binding(写短横线最稳);@ConfigurationProperties 缺失时静默为 null。

Spring Boot Could not resolve placeholder @Value 配置 排错 真实验证 动画演示
Spring 全家桶 2026-10-23

HttpMessageNotReadableException:请求体常见错误各对应什么报错

实测 Spring Boot 4.0.8(Jackson 3.1.5)读 JSON 请求体的 22 种情况:5 种悄悄通过(数字字符串、1.5 截成 1、BOM、重复键、未知字段),17 种返回 400,顶层都是 HttpMessageNotReadableException,最内层分别是 StreamReadException、InvalidFormatException、MismatchedInputException 等;响应体不带原因,开启 problemdetails 后 detail 也只有 Failed to read request。

Spring Boot 4 Jackson 3 HttpMessageNotReadableException JSON 400 排错 真实验证 动画演示
Spring 全家桶 2026-10-23

UnexpectedRollbackException:marked as rollback-only 是怎么触发的

实测 Spring Boot 4.0.8 的 UnexpectedRollbackException:内层 REQUIRED 抛 RuntimeException、外层吞掉异常后提交,抛 Transaction rolled back because it has been marked as rollback-only,两行都被回滚;REQUIRES_NEW、NESTED、noRollbackFor、自调用、检查异常等写法各自的行为与表里的结果;setRollbackOnly 与重新抛出不会触发它。

Spring 事务 UnexpectedRollbackException rollback-only Transactional 排错 真实验证 动画演示
Spring 全家桶 2026-10-23

JdbcClient、JdbcTemplate、JPA:单条与批量写入的吞吐

实测 Spring Boot 4.0.8 + MySQL 上 JdbcTemplate、JdbcClient、JPA 的写入吞吐:自动提交逐行只有几千行/秒且波动很大,同一事务逐行约 2 万行/秒,JdbcTemplate 与 JdbcClient 的差别小于波动;加 rewriteBatchedStatements=true 后 batchUpdate 约 25 万行/秒、JPA saveAll(AUTO 主键)6.5 万到 8.6 万行/秒,IDENTITY 主键仍约 2.1 万行/秒。

Spring JdbcTemplate JdbcClient JPA 批量写入 rewriteBatchedStatements MySQL 真实验证 动画演示
Spring 全家桶 2026-10-23

Caffeine 本地缓存与 Redis:延迟与命中情况

实测 Spring Framework 7 的 CaffeineCacheManager 与 spring-data-redis 的 RedisCacheManager:命中读取 Caffeine 平均 0.08 µs、Redis(本机回环)平均 42.34 µs,8 线程吞吐 39973 万对 8 万次每秒;值大小影响不明显;Redis 的 put 返回时数据还没对 get 可见(2000 次里 1944 次读不到);Caffeine 返回同一个引用,Redis 每次反序列化新对象。

Spring Cache Caffeine Redis 本地缓存 延迟 吞吐 真实验证 动画演示
Spring 全家桶 2026-10-23

Jackson 2 与 Jackson 3:序列化吞吐

实测 Jackson 2.21.5 与 Jackson 3.1.5 序列化与反序列化同一个约 1 KB 的订单对象:输出同样 980 字节(Jackson 3 字段按字母序);序列化单线程 Jackson 3 快 9% 到 13%、4 线程慢 13% 到 19%,反序列化持平,readTree 单线程 98%;差距大多在 20% 以内。

Jackson 3 Jackson 2 序列化 性能 吞吐 Spring Boot 4 真实验证 动画演示
Spring 全家桶 2026-10-23

HikariCP 连接池大小设多少:不同大小下的吞吐和等待

实测 Spring Boot 4.0.8 + HikariCP + MySQL 上 maximum-pool-size 从 1 到 64:查询是 sleep 5 ms 时吞吐从 163 涨到 7718 次/秒几乎线性;查询是全表扫描的 CPU 型时从 82 涨到 434 次/秒,8 之后增长很慢;池小时有线程整个测试期间几乎拿不到连接(P99 获取连接约 5 秒)。

HikariCP 连接池 maximum-pool-size Spring Boot MySQL 吞吐 真实验证 动画演示
Spring 全家桶 2026-10-23

Spring Boot 最少要多少内存:-Xmx 压到多低还能启动

实测 Spring Boot 4.0.8 最少需要多少堆:只有 starter-web 的最小应用 -Xmx10m 能启动(6m、8m 都 OOM),加 JPA 与 H2 后 -Xmx20m 能启动(16m OOM);但进程常驻内存(RSS)堆压到 10 MB 仍有约 147 MB,JPA 应用 220 MB 以上;小堆时 JPA 应用启动明显变慢。

Spring Boot 内存 Xmx JVM RSS 启动 真实验证 动画演示
Spring 全家桶 2026-10-22

OAuth2 Client:令牌的获取、刷新与存放

实测 Spring Security 7 的 OAuth2 Client(oauth2Login):跳转链共 7 个请求,机密客户端也自动带 PKCE;登录后 principal 是 DefaultOidcUser;令牌默认存在进程内存里;62 秒有效期的 access_token 在 4 秒后被自动用 refresh_token 刷新;客户端重启后旧 JSESSIONID 302 回授权入口。

Spring Security OAuth2 oauth2Login OIDC 令牌刷新 真实验证 动画演示
Spring 全家桶 2026-10-22

安全响应头与 HTTPS 重定向

实测 Spring Security 7 的安全响应头与 HTTPS 重定向:默认加 nosniff、X-Frame-Options: DENY、no-store 一组缓存头,没有 CSP;HSTS 只出现在 HTTPS 响应里;redirectToHttps 配 portMapper 把 HTTP 302 到 HTTPS;requiresChannel 老写法在 7.0.7 里启动失败;放在反向代理后面不配 forward-headers-strategy 就会白白重定向。

Spring Security 响应头 HSTS HTTPS重定向 反向代理 真实验证 动画演示
Spring 全家桶 2026-10-22

记住我与登录失败防护

实测 Spring Security 7 的 rememberMe 与登录失败防护:remember-me cookie 有效期 14 天、值带 SHA256 签名,恢复的身份过不了 fullyAuthenticated;登出不会让已保存的 cookie 失效,改密码、重启(默认随机 key)才会;{noop} 密码登录后被升级成 bcrypt 也会让 cookie 失效;框架默认没有失败锁定,自己监听事件实现后登录页仍只显示 Invalid credentials。

Spring Security 记住我 rememberMe 登录失败 账号锁定 真实验证 动画演示
Spring 全家桶 2026-10-22

安全测试:@WithMockUser 与 MockMvc

实测 Spring Security 7 的测试:@WebMvcTest 不加载自己的安全配置,/admin 谁登录都能进、测试假绿;@WithMockUser 的 roles 与 authorities 的区别、POST 要 csrf()、httpBasic 与 @WithUserDetails 走真实用户;方法级安全的异常类型;@WithMockUser 不会传播到新线程;standaloneSetup 完全绕过安全过滤器。

Spring Security 测试 WithMockUser MockMvc WebMvcTest 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号