大数跨境
0
0

Spring 7.0 正式发布啦!强大新特性强势来袭

Spring 7.0 正式发布啦!强大新特性强势来袭 Spring全家桶实战案例
2025-11-14
0
导读:Spring 7.0 正式发布啦!强大新特性强势来袭
Spring Boot 3实战案例锦集PDF电子书已更新至130篇!

🎉🎉《Spring Boot实战案例合集》目前已更新190个案例,我们将持续不断的更新。文末有电子书目录。

💪💪永久更新承诺

我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务

💌💌如何获取
订阅我们的合集点我订阅,并通过私信联系我们,我们将第一时间将电子书发送给您。

→ 现在就订阅合集

环境:Spring7.0



1. 简介

Spring Framework 7 携众多期待已久的功能与精心打磨的改进而来,涵盖测试、API 设计及核心基础设施领域。这些变革在实现框架现代化升级的同时,有效减少了日常开发中的冗余代码。

2. 新特性
2.1 基线升级

Spring Framework 7.0 保留了 JDK 17 的基线,同时推荐将 JDK 25 作为最新的 LTS 版本。它还引入了 Jakarta EE 11 基线,并支持 Kotlin 2.2 以及 GraalVM 25。

具体而言,这一新版本对以下内容提高了最低要求:

  • Servlet 6.1(Tomcat 11.0、Jetty 12.1)
  • JPA 3.2(Hibernate ORM 7.1/7.2)
  • Bean Validation 3.1(Hibernate Validator 9.0/9.1)
  • GraalVM 25,采用新的“精确可达性元数据”格式
  • Netty 4.2(见 #34996
  • Kotlin 2.2(见 #33629
  • JUnit 6
2.2 已移除的 API

移除 Spring JCL

已移除 spring-jcl 模块,转而使用 Apache Commons Logging 1.3.0。对于大多数应用程序而言,此更改是透明的,因为 spring-jcl 是一个传递依赖项,日志 API 调用应该不会改变。更多详情见 #32459

移除对 javax.annotation 和 javax.inject 注解的支持

不再支持 javax.annotation 和 javax.inject 包中的注解。这包括 @javax.annotation.Resource@javax.annotation.PostConstruct@javax.inject.Inject 等注解。如果您的应用程序仍在使用这些包中的注解,则需要迁移到 jakarta.annotation 和 jakarta.inject 包中的对应注解。

移除已弃用的路径映射选项

  • 用于注解控制器方法的 suffixPatternMatch/registeredSuffixPatternMatch

  • AbstractHandlerMapping 扩展中的 trailingSlashMatch

  • 用于内容协商的 favorPathExtension/ignoreUnknownPathExtensions 以及底层的 PathExtensionContentNegotiationStrategy 和 ServletPathExtensionContentNegotiationStrategy,可通过 ContentNegotiationManagerFactoryBean 和 MVC Java 配置进行配置

  • PathPatternParser 中的 matchOptionalTrailingSeparator

移除 Undertow 支持

Undertow 项目目前不支持 Servlet 6.1,而 Servlet 6.1 是此 Spring Framework 版本的基线要求。因此,我们已移除 WebSocket 支持和 WebFlux 应用程序的低级 HTTP 支持中针对 Undertow 的特定类。

由于 Spring MVC 应用程序可以部署在任何符合 Servlet 6.1 规范的服务器上,一旦有兼容 Servlet 6.1 的 Undertow 版本发布,Undertow 用户将能够利用我们的标准 Servlet 支持。

其他移除项

作为 #33809 的一部分,许多其他 API 和功能已被移除,包括:

  • 用 CompletableFuture 替代 ListenableFuture

  • 用 org.webjars:webjars-locator-lite 替代 org.webjars:webjars-locator-core 对 WebJars 的支持

  • 移除对 OkHttp3 的支持

  • 作为 #35525 的一部分,将 RequestContext#jstPresent 受保护的静态字段重命名为 JSTL_PRESENT

  • 作为 #35748 的一部分,移除 HttpComponentsClientHttpRequestFactory#setConnectTimeout 方法

2.3 最大变更

SpringExtension 扩展上下文范围

SpringExtension 将 Spring TestContext 框架集成到 JUnit Jupiter 中,现在使用测试方法范围的 ExtensionContext(见 #35697)。尽管此更改允许在 @Nested 测试类层次结构中实现一致的依赖注入语义,但对于自定义的 TestExecutionListener 实现可能会构成重大变更。

如果您发现升级到 Spring Framework 7.0 后,@Nested 测试类层次结构中的 Spring 相关集成测试开始失败,您可能需要在此类层次结构的顶级类上标注 @SpringExtensionConfig(useTestClassScopedExtensionContext = true)。

如果您开发了一个自定义的 TestExecutionListener,该监听器重写了 prepareTestInstance(TestContext) 方法,并且该监听器在 Spring Framework 7.0 中不再正常工作,您可能需要修改监听器的实现,通过 testContext.getTestInstance().getClass() 而不是 testContext.getTestClass() 来查找当前测试类。详情见更新后的 Javadoc。

已弃用项

  • RestTemplate

RestTemplate 之前已被声明为“功能完整”。自 Spring Framework 7.0 起,我们在参考文档中将其标记为已弃用,并将在 Spring Framework 7.1 中正式使用 @Deprecated 标记。更多详情见“HTTP 客户端的状态”博客文章。

  • Spring MVC 的 <mvc:* XML 配置命名空间

    Spring MVC 的 <mvc:* XML 配置命名空间现已弃用,推荐使用 Java 配置变体。目前尚无完全移除它的计划,但 XML 配置将不会更新以遵循 Java 配置模型。其他命名空间(如 <bean>)未被弃用。

  • Kotlin 脚本模板支持

    Kotlin 团队已表示打算在未来的 Kotlin 2.x 版本中移除 JSR 223 支持。因此,Spring 中对 Kotlin 脚本的模板支持已被弃用。

  • Spring TestContext 框架中的 JUnit 4 支持

    Spring TestContext 框架中的 JUnit 4 支持现已弃用,推荐使用针对 JUnit Jupiter 的 SpringExtension。弃用的类包括 SpringRunner、SpringClassRule、SpringMethodRule、AbstractJUnit4SpringContextTests、AbstractTransactionalJUnit4SpringContextTests 及相关支持类。

  • Jackson 2.x 支持

    Jackson 2.x 支持已被弃用,推荐使用 Jackson 3.x(见 #33798)。

  • Spring MVC 中 PathMatcher 的使用

    Spring MVC 中 PathMatcher 的使用现已弃用(见 #34018)。

  • HandlerMappingIntrospector SPI

    HandlerMappingIntrospector SPI(用于对齐 Spring Security 和 Spring MVC 路径匹配)已被弃用(见 #34019 和 spring-security/16886)。

  • HttpStatus 类更新

    我们更新了 HttpStatus 类,以更好地与最新的 RFC9110 对齐。这主要体现在新增了 HTTP 状态码,并对一些状态码进行了弃用并提供了即时替代项。

  • 空安全

    Spring 的空值注解(具有 JSR 305 语义)已被弃用,推荐使用 JSpecify 注解。Spring Framework 代码库已迁移到 JSpecify,并现在指定了数组/可变参数元素和泛型的空值。

  • HttpHeaders 变更

    在 7.0 版本中,HttpHeaders API 进行了修订;此类不再扩展 MultiValueMap 契约。底层服务器将请求头更像是一对集合来处理,并且许多类似映射的操作由于请求头本质上不区分大小写,所以表现或性能不佳。因此,我们移除了多个方法,并引入了立即标记为 @Deprecated 的回退方法,如 HttpHeaders#asMultiValueMap。请尽可能考虑使用其他方法。

  • Servlet 6.1 和 WebSocket 2.2

    Spring Framework 7.0 采用 Jakarta Servlet 6.1 和 WebSocket 2.2 作为 Web 应用程序的新基线。实际上,这意味着应用程序应部署在最近的 Servlet 容器上,如 Tomcat 11+ 和 Jetty 12.1+。

  • JPA 3.2 和 Hibernate ORM 7.1/7.2

    JPA 3.2 引入了一种新的依赖注入安排:现在可以通过 @Inject/@Autowired 注入 EntityManagerFactory 及其共享的 EntityManager 引用,包括用于选择特定持久化单元的限定符支持。在典型的 Spring 设置中,LocalContainerEntityManagerFactoryBean 本身会提供此类默认或限定的 EntityManager 引用;不再需要单独的 SharedEntityManagerBean 定义。Spring Framework 7.0 还采用 Hibernate ORM 7.1/7.2 作为 JPA 提供程序,曾经位于 org.springframework.orm.hibernate5 中的原生 Hibernate 支持已迁移到 orm.jpa.hibernate 包。请注意,仅继续提供在 JPA 本身之外有意义的功能:LocalSessionFactoryBean/Builder、HibernateTransactionManager、SpringBeanContainer、SpringSessionContext。这可作为标准 JPA 引导的替代方案,并且还能够支持基于 SessionFactory#getCurrentSession() 的数据访问代码。

  • JPA 3.2/4.0 的持久化单元管理

    为了使 JPA 3.2 使用体验无警告,并与 JPA 4.0 向前兼容,Spring 的 MutablePersistenceUnitInfo 现在与标准的 PersistenceUnitInfo 接口解耦。MutablePersistenceUnitInfo 最初设计为 PersistenceUnitPostProcessor 的参数类型,现在专门用于此目的;它不能再赋值给 jakarta.persistence.spi.PersistenceUnitInfo,因为它不再直接实现该接口。

  • JMS 目标处理

    随着 JmsClient 的引入(见下文),我们将默认的 DestinationResolver 更改为新的 SimpleDestinationResolver,它会缓存会话解析的队列和主题实例。这也默认适用于 JmsTemplate 和监听器容器。如果您需要在每次调用时强制进行新鲜解析(即使对于常见的 JMS 代理来说这通常不是必需的),请显式配置 DynamicDestinationResolver。

  • Jackson 3.x 支持

    自 #33798 起,我们在整个堆栈中默认支持 Jackson 3.x,回退到 Jackson 2.x。Spring Framework 已弃用对 Jackson 2.x 代的支持,我们的当前计划是在 7.1 版本中禁用其自动检测,并在 7.2 版本中完全移除对其的支持。Jackson 3.x 使用新的 tools.jackson 包,这与传统的 com.fasterxml.jackson 包不同。来自 "jackson-annotation" 构件的类(如 @JsonView 和 @JsonTypeInfo)仍保留在 com.fasterxml.jackson 包中,以便于升级。

    Jackson 3.x 没有与 Jackson2ObjectMapperBuilder 等效的类。我们现在推荐使用 Jackson 的 JsonMapper.builder()、CBORMapper.builder() 等作为替代方案。

2.4 强大新特新

  • 空安全

    Spring Framework 代码库使用 JSpecify 注解来声明 API、字段和相关类型使用的空值。与之前基于 JSR 305 的安排相比,JSpecify 提供了显著增强,如正确定义的规范、无拆分包问题的规范依赖、更好的工具支持、更好的 Kotlin 集成,以及为泛型类型、数组和可变参数元素指定空值的能力。也推荐在基于 Spring 的应用程序中使用 JSpecify 注解。更多信息见参考文档中修订后的“空安全”部分。

  • Java 24+ 应用程序的类文件 API 使用

    Spring Framework 读取类字节码以收集有关应用程序代码的元数据。从历史上看,我们通过 org.springframework.core.type.classreading 包中的 MetadataReaderFactory 和 MetadataReader 类型使用了精简的 ASM 分支来实现此目的。尽管 Spring 应用程序通常不会直接接触此 API,但在解析 @Configuration 类或查找应用程序代码上的注解时,此 API 特别有用。

    Java 24 通过 JEP 484 引入了新的类文件 API,用于读取和写入 Java 字节码。Spring Framework 7.0 为 Java 24+ 应用程序采用了此功能,在 spring-core 中实现了新的 ClassFileMetadataReader。对于应用程序而言,这应该是完全透明的。

  • 编程式 Bean 注册

    应用程序永远不应尝试在 @Configuration 类中的单个 @Bean 方法内注册多个 Bean。同样,@Bean 方法应声明最具体的类型作为其返回类型。当需要更多逻辑或需要多次注册时,这些要求往往会妨碍更灵活的 Bean 注册。

    此主要版本引入了新的编程式 Bean 注册机制,使用 BeanRegistrar 契约,这将有助于此类用例。见参考文档中的新“编程式 Bean 注册”部分。

  • SpEL 表达式中 Optional 类型的支持以及空安全和 Elvis 操作符

    java.util.Optional 类型现在在 SpEL 表达式中得到了更好的支持。您现在不仅可以在 Optional 类型上调用空安全操作并透明地解包,还可以使用 Elvis 操作符自动解包 Optional。

  • 一致的代理类型默认设置以及特定 Bean 的选择退出

    自 7.0 版本起,全局代理类型默认设置为 CGLIB(如 Spring Boot 中)将一致地应用于所有代理处理器(包括 @Async 等)。出于自定义目的,可以声明一个类型为 ProxyConfig 的 Bean,其名称为 AutoProxyUtils.DEFAULT_PROXY_CONFIG_BEAN_NAME,其中包含当前应用程序上下文的默认代理设置。

    可以通过新的 @Proxyable 注解为单个 Bean 选择退出。例如,在 CGLIB 目标类默认情况下,通过 @Proxyable(INTERFACES),或者在常规默认(具有接口的 JDK 动态代理)情况下,通过 @Proxyable(TARGET_CLASS),在 @Bean 方法或扫描的 @Component 类级别声明。作为额外福利,可以通过 @Proxyable(interfaces=MyService.class) 建议特定于 Bean 的代理接口,这也会覆盖任何上下文范围的默认代理类型。

  • 弹性功能:RetryTemplate、@Retryable、@ConcurrencyLimit

    Spring 团队长期致力于 Spring Retry 项目,我们决定精简不必要的功能,重新审视其部分 API,并将所得工作合并到 Spring Framework 的 spring-core 模块中。此新的基础重试支持位于 org.springframework.core.retry 包中,其中包括 RetryTemplate、RetryPolicy 和支持类。

    与 core.retry 对齐,spring-context 模块中还有 @Retryable 注解支持,以及基于 Spring 并发限制支持的 @ConcurrencyLimit 注解。两者都可以通过 @EnableResilientMethods 在 @Configuration 类上方便地启用。查看参考文档中的新弹性章节以及相关博客文章。

    注意,@Retryable(包括通过注解属性进行的自定义)会自动适配具有响应式返回类型的响应式方法,使用 Reactor 的重试功能装饰管道。常规命令式方法将通过具有相应 RetryPolicy 的 RetryTemplate 调用。

    详细使用请查看下面链接:

    Spring 7.0 三大王炸注解来袭

  • HTTP 接口客户端配置

    现在提供专门的 HTTP 接口客户端配置支持,当您使用许多 HTTP 接口和目标主机时,可以显著简化所需配置。这是通过 @ImportHttpServices 声明实现的,该声明让应用程序专注于按组识别 HTTP 服务,并为每个组自定义客户端,而框架透明地创建客户端代理注册表,并将每个代理声明为一个 Bean。例如:

@Configuration(proxyBeanMethods = false)@ImportHttpServices(group = "weather", types = {FreeWeather.class, CommercialWeather.class})@ImportHttpServices(group = "user", types = {UserServiceInternal.class, UserServiceOfficial.class})static class HttpServicesConfiguration extends AbstractHttpServiceRegistrar {
  @Bean  public RestClientHttpServiceGroupConfigurer groupConfigurer() {    return groups -> groups.filterByName("weather""user")        .configureClient((group, builder) -> builder.defaultHeader("User-Agent""My-Application"));  }}
  • HTTP 接口客户端对 InputStream 和 OutputStream 的支持

    现在可以通过 StreamingHttpOutputMessage.Body 方法参数为请求体提供 OutputStream,并且还可以通过 InputStream 或 ResponseEntity<InputStream> 返回值来消费响应。

  • PathPattern 匹配改进

    自 Spring Framework 7.0 起,用于匹配 HTTP 请求映射的旧版 AntPathMatcher 变体已被弃用。我们在 5.0 版本中遇到它们。例如,WebMvcConfigurer#configureMessageConverters 将允许您配置自定义 JSON 转换器,如下所示:

@Configurationpublic class WebConfiguration implements WebMvcConfigurer {
  @Override  public void configureMessageConverters(HttpMessageConverters.ServerBuilder builder) {    JsonMapper jsonMapper = JsonMapper.builder()      .findAndAddModules()      .enable(SerializationFeature.INDENT_OUTPUT)      .defaultDateFormat(new SimpleDateFormat("yyyy-MM-dd"))      .build();    builder.jsonMessageConverter(new JacksonJsonHttpMessageConverter(jsonMapper));  }}
  • 改进 @Nested 测试类层次结构中的依赖注入

    SpringExtension for JUnit Jupiter 现在支持使用用于执行生命周期和测试方法(如 @BeforeEach、@AfterEach、@Test 等)的相同 ApplicationContext,将依赖注入到 @Nested 测试类层次结构中的测试类构造函数和字段中(见 #35697)。这为 @Nested 测试提供了更一致的编程模型。但是,如果您在升级到 Spring Framework 7.0 后遇到问题,请见“SpringExtension 扩展上下文范围”部分,了解可能的重大变更详情。

  • RestTestClient

    这是来自社区的一个流行增强请求:为 WebTestClient 提供非响应式变体。开发人员喜欢 WebTestClient 可以测试实时服务器和模拟设置的方式,具有流畅的 API 和良好的断言。

    现在通过新的 RestTestClient 实现了这一点;您可以将其绑定到实时服务器、MVC @Controller 或应用程序上下文。更多信息见新的 RestTestClient 文档部分。



以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏
强大!Spring非常实用的内置类专门处理Rest API异常

太强了!开源Java并行收集器,秒杀标准并行流

太赞了!AOP弃用@Aspect,一个注解让你的代码灵活十倍!

一定要会!MySQL窗口函数太实用了,再也不怕复杂SQL查询了

性能优化!Spring Boot 弃用 Jackson,性能提升50%

Spring Boot JSON 响应优化:6 个关键技巧全解析

日志泛滥?Spring Boot 日志记录的12条准则

优雅!Spring Boot 处理动态请求body,太强了

Spring Boot 通过 6 种方式实现开关功能,最后一种直接封神

强!Spring Boot 通过服务定位干掉if-else

技术专家!Spring Boot 运行时动态修改执行SQL,支持JPA,MyBatis,JDBC

图片
图片
图片
图片
图片
图片
图片

【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读38
粉丝0
内容832