实测 Spring Security 6.5(Boot 3.5.16)升到 7.0(Boot 4.0.8):32 种常见写法 6.5 通过 27 个、7.0 通过 14 个;csrf()、formLogin()、authorizeRequests() 等无参重载与 .and() 链式、AntPathRequestMatcher、MvcRequestMatcher、FilterSecurityInterceptor、AccessDecisionManager 在 7.0 里没了,DaoAuthenticationProvider 无参构造也没了;lambda 写法的配置在两个版本上授权结果一致。
实测 Spring Boot 3.5.16(Hibernate 6.6.53)升到 4.0.8(Hibernate 7.2.24):同一份实体在 MySQL 上生成的表与 DDL 完全一致,旧库 validate 与 update 都不动;join fetch 分页、22 条 HQL 里 21 条结果一致;变的是 API:MySQL8Dialect、@Where、@Proxy、Session.save、saveOrUpdate 在 7.2 里找不到。
实测 Spring Boot 4.0.8 的 starter 拆分:只把版本从 3.5.16 换成 4.0.8、依赖不动,Flyway、Liquibase、spring-kafka、RestClient.Builder、WebClient.Builder 的自动配置静默消失(类在 classpath 上、容器里没有 Bean,没有报错);AOP 与 Prometheus 不受影响。
实测 Spring Boot 4.0.8 里 NoSuchBeanDefinitionException(could not be found)的六种成因:忘了加 @Component、包扫描范围之外、@Profile 没激活、@ConditionalOnProperty 不满足、接口没有实现 Bean、@Bean 返回类型写成 Object,启动报错一字不差;条件报告与 TRACE 日志各能区分哪几种;List<T> 找不到时不报错而是注入空集合。
实测 Spring Boot 4.0.8 里 Failed to configure a DataSource 的成因:没有 url、拼错属性名、驱动缺失得到的报错不同;H2 与环境变量可以启动;starter-jdbc 下连不上、密码错、库不存在都是第一次用连接才失败,starter-data-jpa 启动就失败;排除 DataSourceAutoConfiguration 的旧类名在 Boot 4 里被静默忽略。
实测 Spring Boot 4.0.8 + Hibernate 7.2 的 LazyInitializationException:默认 open-in-view=true 时不会出现但连接被请求占着(active=1)、N+1 是 6 条 SQL;关掉后直接访问懒加载集合抛 no session,@Transactional 仍是 6 条,join fetch、@EntityGraph、DTO 投影都是 1 条;hibernate.enable_lazy_load_no_trans 压住异常却要 11 条 SQL、6 个 Session。
实测 Spring Boot 4.0.8 的 Unable to find a @SpringBootConfiguration:测试类从自己的包往上找,同包与子包能找到,兄弟包、父包、无关包都找不到;classes = App.class 与 @ContextConfiguration 能补救,嵌套 @Configuration 会得到只有 8 个 Bean 定义的几乎空上下文,嵌套 @TestConfiguration 不算;同一个包有两个主类时报 Found multiple。
实测 Spring Boot 4.0.8 的 Spring MVC 4xx 来源:404 多数是 NoResourceFoundException(静态资源处理器抛的,结尾斜杠也是);405、406、415 都在 RequestMappingInfoHandlerMapping.handleNoMatch;400 有 MissingServletRequestParameterException、MethodArgumentTypeMismatchException、HttpMessageNotReadableException、MethodArgumentNotValidException 等;缺 multipart 是 500;非法百分号编码由 Tomcat 直接 400。
实测 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 万行/秒。