大家好,这里是架构资源栈 !点击上方关注,添加"星标",一起学习大厂前沿架构!
关注、发送C1
即可获取JetBrains全家桶激活工具和码!
Spring Framework 6.2 正式发布!作为企业级 Java 应用的核心支柱,本次更新不仅带来了大量底层机制的重构和性能优化,还为开发体验、测试方式、Native 兼容性等维度注入了诸多现代化能力。小D第一时间为大家梳理出了其中最值得关注的亮点与注意事项。
升级必读:兼容性与依赖更新
Spring Framework 6.2 在依赖上有了一些基础性提升:
- GraalVM 原生镜像支持需使用 Hibernate 6.5
- FreeMarker 升级至 2.3.33
- HtmlUnit 升级至 4.2
- 支持 Protobuf 4.x,最低版本为 3.29
- 推荐使用 Jackson 2.18,仍保留对 2.15+ 的兼容性
此外,一些废弃的 API 已被彻底移除,升级时建议参考对应 issue:30608、31492 和 33123。
核心容器的行为调整与增强
自动装配算法优化
新的自动装配规则调整了匹配优先级:参数名和 @Qualifier
的匹配优先于 @Priority
,从而更贴合开发者预期。而 @Primary
依旧拥有最高优先级。
并新增了全新的 @Fallback
注解,用于提供默认 Bean:
java
@Bean
@Fallback
MyService defaultMyService() {
return new DefaultMyServiceImpl();
}
当不存在其他同类型 Bean 时,@Fallback
会被自动采纳,而无需额外声明 @Primary
。
更严格的配置类校验
Spring 现在会明确拒绝一些无效的 @Configuration
声明,如:
@Bean
方法返回void
@Bean
方法同时标注了@Autowired
此外,泛型匹配也更严格,建议开发者检查构造参数、方法返回类型等是否完全匹配,避免类型擦除带来的注入失败。
更智能的启动与组件扫描机制
Spring 容器的锁机制也更细致:主线程采用严格锁定,而后台 Bean 初始化采用宽松锁。可通过 spring.locking.strict=true
控制恢复旧行为。
为了提升性能,类路径扫描默认启用了 jar 缓存,若导致异常可关闭缓存:
java
resolver.setUseCaches(false);
此外,现在不允许将 @ComponentScan
与后期条件(如 @ConditionalOnBean
)组合使用,否则将直接抛出异常。
配置解析与占位符增强
占位符解析器已被重写,提升了灵活性与容错性。支持转义 ${}
占位符,防止误解析:
properties
my.prop=\\${actual.value} # 解析为 ${actual.value}
若 key 中含 :
字符,需进行转义,如:${sub\://host}
。
SpEL 表达式引擎增强
现在可以自定义索引访问器(IndexAccessor)用于自定义结构的下标访问,同时也支持安全导航运算符对下标操作生效。访问属性时优先使用类型匹配更明确的 PropertyAccessor
,行为更稳定。
RestClient 行为变更
以前这样写虽然不会报错,但并不会真正发出请求:
java
ResponseSpec spec = restClient.get().uri("/spring").retrieve();
现在必须添加终止操作,如:
java
ResponseEntity<Void> response = restClient.get().uri("/spring")
.retrieve()
.toBodilessEntity();
Web 领域的细节更新
- 静态资源路径自动补
/
,避免路径拼接异常 webjars-locator-core
被弃用,推荐使用轻量级版本webjars-locator-lite
- WebFlux 返回空响应体时不再自动写入
Content-Type
@ExceptionHandler
现已支持内容协商,自动根据客户端请求选择 JSON 或 HTML 响应格式:
java
@ExceptionHandler(produces = "application/json")
public ResponseEntity<ErrorMessage> handleJson(IllegalArgumentException e) {
return ResponseEntity.badRequest().body(new ErrorMessage(e.getMessage(), 42));
}
测试体验再升级!
支持 AssertJ 的 MockMvc API
终于不用再被 Hamcrest 束缚!现在可通过 AssertJ 写出更清晰、链式的测试语句:
java
assertThat(mvc.perform(get("/vehicle/12")))
.hasStatusOk()
.body().isEqualTo("Honda Civic");
更复杂的 JSON 验证也变得简单:
java
assertThat(mvc.perform(get("/message")))
.body().json()
.isLenientlyEqualTo(new ClassPathResource("samples/message.json"));
动态属性注入、Bean 覆盖能力提升
支持在测试上下文中动态注册属性,也新增了 @TestBean
、@MockitoBean
、@MockitoSpyBean
等用于 Bean 重定义的测试注解,参考官方文档即可上手。
原生支持与安全能力并进
- 引入
@RegisterReflection
、@ReflectionScan
,方便原生应用注册反射信息 - URI 解析逻辑更安全,默认遵循 RFC 3986,同时提供浏览器风格的宽容模式
- 新增
UrlHandlerFilter
,用于兼容旧的尾斜杠路径策略
其他值得一提的亮点
@Scheduled
和@DurationFormat
现在支持如2h30m
这种更自然的时间表达方式- 支持从请求头中绑定数据到
@ModelAttribute
- WebMvc 和 WebFlux 支持页面片段渲染,适配 htmx、Turbo 等前端工具
- Spring Expression Language 对 varargs、数组索引支持更全面
- Reactive 服务器(除了 Undertow)支持 Partitioned Cookies
Spring Framework 6.2 带来的变动不止于 API 调整,更是在架构理念与开发体验上的一次升级。对于追求开发效率、原生兼容性和测试友好度的 Java 团队来说,这次更新提供了不少实用新特性。建议升级前仔细阅读官方文档并充分测试现有项目。
本文由博客一文多发平台 OpenWrite 发布!