实测 Spring Boot 4.0.8 的 Could not resolve placeholder:没定义、key 拼错、配置文件名错、profile 没激活四种原因报错完全一样;默认值写法与空格;嵌套占位符与引用链报错;@Value 与 relaxed binding(写短横线最稳);@ConfigurationProperties 缺失时静默为 null。
实测 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.0.8 的 UnexpectedRollbackException:内层 REQUIRED 抛 RuntimeException、外层吞掉异常后提交,抛 Transaction rolled back because it has been marked as rollback-only,两行都被回滚;REQUIRES_NEW、NESTED、noRollbackFor、自调用、检查异常等写法各自的行为与表里的结果;setRollbackOnly 与重新抛出不会触发它。
实测 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 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 每次反序列化新对象。
实测 Jackson 2.21.5 与 Jackson 3.1.5 序列化与反序列化同一个约 1 KB 的订单对象:输出同样 980 字节(Jackson 3 字段按字母序);序列化单线程 Jackson 3 快 9% 到 13%、4 线程慢 13% 到 19%,反序列化持平,readTree 单线程 98%;差距大多在 20% 以内。
实测 Spring Boot 4.0.8 + HikariCP + MySQL 上 maximum-pool-size 从 1 到 64:查询是 sleep 5 ms 时吞吐从 163 涨到 7718 次/秒几乎线性;查询是全表扫描的 CPU 型时从 82 涨到 434 次/秒,8 之后增长很慢;池小时有线程整个测试期间几乎拿不到连接(P99 获取连接约 5 秒)。
实测 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 Security 7 的 OAuth2 Client(oauth2Login):跳转链共 7 个请求,机密客户端也自动带 PKCE;登录后 principal 是 DefaultOidcUser;令牌默认存在进程内存里;62 秒有效期的 access_token 在 4 秒后被自动用 refresh_token 刷新;客户端重启后旧 JSESSIONID 302 回授权入口。
实测 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 7 的 rememberMe 与登录失败防护:remember-me cookie 有效期 14 天、值带 SHA256 签名,恢复的身份过不了 fullyAuthenticated;登出不会让已保存的 cookie 失效,改密码、重启(默认随机 key)才会;{noop} 密码登录后被升级成 bcrypt 也会让 cookie 失效;框架默认没有失败锁定,自己监听事件实现后登录页仍只显示 Invalid credentials。
实测 Spring Security 7 的测试:@WebMvcTest 不加载自己的安全配置,/admin 谁登录都能进、测试假绿;@WithMockUser 的 roles 与 authorities 的区别、POST 要 csrf()、httpBasic 与 @WithUserDetails 走真实用户;方法级安全的异常类型;@WithMockUser 不会传播到新线程;standaloneSetup 完全绕过安全过滤器。