Spring Boot 4.0最近GA了,下面是4.0版本的发布说明。
1. 从 Spring Boot 3.5 升级
由于这是一个主要版本的发布,升级现有应用程序可能比平时更复杂一些。我们编写了一个专门的迁移指南来帮助您升级现有的 Spring Boot 3.5 应用程序。
迁移指南:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.0-Migration-Guide
如果您目前运行的是早期版本的 Spring Boot,我们强烈建议您先升级到 Spring Boot 3.5,然后再迁移到 Spring Boot 4.0。
2. 新特性和亮点
提示:查看配置更改日志以获取配置更改的完整概述。
配置更改日志:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.0-Configuration-Changelog
2.1 里程碑版本发布
从 4.0.0-M1 开始,所有 Spring Boot 里程碑版本(和发布候选版本)现在除了在 https://repo.spring.io 发布外,还发布到 Maven Central。这使得在 4.x 系列中尝试新的里程碑版本变得更加容易。
2.2 Gradle 9
现在支持使用 Gradle 9 构建 Spring Boot 应用程序。对 Gradle 8.x(8.14 或更高版本)的支持仍然存在。
2.3 HTTP 服务客户端
Spring Boot 现在包括对 HTTP 服务客户端的自动配置支持和配置属性。HTTP 服务客户端允许您注释普通的 Java 接口,并让 Spring 自动创建它们的实现。
例如,以下接口可用于调用 "echo" 服务:
java
@HttpExchange(url = "https://echo.zuplo.io")
public interface EchoService {
@PostExchange
Map<?, ?> echo(@RequestBody Map<String, String> message);
}
有关此功能的完整详细信息,请参阅相关的文档(https://docs.spring.io/spring-boot/4.0/reference/io/rest-client.html#io.rest-client.httpservice)。
2.4 API版本
为 Spring MVC 和 Spring WebFlux 添加了 API 版本控制的自动配置。
可以使用 spring.mvc.apiversion.* 或 spring.webflux.apiversion.* 属性配置 API 版本控制。对于更高级的控制,可以定义 ApiVersionResolver、ApiVersionParser 和 ApiVersionDeprecationHandler 类型的 bean。
有关更多详细信息,请参阅参考文档(MVC、WebFlux)。
Spring Web MVC:
WebFlux:
2.5 JmsClient
JMS 的自动配置现在包括对新 JmsClient API 的支持。对 JmsTemplate 和 JmsMessagingTemplate 的支持保持不变。
2.6 任务装饰
任务调度和任务执行的自动配置现在支持多个 TaskDecorator bean。当上下文中包含多个 TaskDecorator bean 时,将创建一个委托给它们的 CompositeTaskDecorator。各个装饰器按照 @Order 和 Ordered 定义的顺序调用。
2.7 OpenTelemetry starter
添加了一个新的starter,spring-boot-starter-opentelemetry。此starter引入了通过 OTLP 导出指标和跟踪所需的所有依赖项。它还将自动配置 OpenTelemetry SDK。
2.8 外部类型的配置属性元数据
现在,@ConfigurationProperties 注解的类型可以引用位于不同模块中的类型。要从此类模块中获取元数据,您应添加注解处理器(如果需要)并使用 @ConfigurationPropertiesSource 标记该类型。
有关更多详细信息,请参阅参考文档(https://docs.spring.io/spring-boot/4.0/specification/configuration-metadata/index.html)。
2.9 SSL信息
从 SSL 信息贡献中移除了对证书有效性阈值的支持。状态为 WILL_EXPIRE_SOON 的证书现在将显示为 VALID。证书有效期的开始和结束信息保持不变。
2.10 SSL健康
包含一个或多个将在配置阈值内过期的证书(management.health.ssl.certificate-validity-warning-threshold)的证书链现在在健康响应的详细信息中列在一个新的 expiringChains 条目中。不再使用 WILL_EXPIRE_SOON 状态,即将过期的证书将具有 VALID 状态。
2.11 MongoDB健康指示器
MongoDB 健康指示器已重新设计,不再需要 Spring Data MongoDB。这允许在使用 MongoDB Java 驱动程序直接使用时提供健康信息。
作为此更改的一部分,健康指示器已从 spring-boot-data-mongodb 移动到 spring-boot-mongodb。它们的包也已相应更新。
2.11.1 MongoDB属性
引入了一个新属性 spring.data.mongodb.representation.big-decimal,用于控制 Spring Data MongoDB 如何在 MongoDB 中存储 BigDecimal(和 BigInteger)值。
还重命名了一些属性。有关详细信息,请参阅迁移指南(https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.0-Migration-Guide)。
2.12 Kotlin序列化
Spring Boot 现在提供了一个新的 "spring-boot-kotlinx-serialization-json" 模块和相应的 "spring-boot-starter-kotlin-serialization",用于支持 Kotlin 序列化。这将提供一个 Json bean,并使用可用的 spring.kotlinx.serialization.json.* 属性进行配置。
注意,还将为应用程序提供一个 HttpMessageConverter,并将其设置为优先于其他 JSON 转换器(作为回退)。
2.13 RestTestClient
添加了对新引入的 RestTestClient 的支持(https://docs.spring.io/spring-framework/reference/testing/resttestclient.html)。
使用常规的 @SpringBootTest 或使用 @AutoConfigureMockMvc 时,您可以自动装配一个在底层 MockMvc 实例上操作的 RestTestClient。
对于集成测试,即使用 @SpringBootTest 并定义或随机端口时,可以注入一个 RestTestClient 以针对正在运行的服务器。
2.14 Redis静态主/副本
添加了对静态主/副本的自动配置。此功能仅由 Lettuce 支持。
要使用它,请使用新的 spring.data.redis.masterreplica.nodes 属性提供静态节点列表。
2.15 Redis可观测性
改进了 Redis 的自动配置,以自动配置 MicrometerTracing,而不是 MicrometerCommandLatencyRecorder。前者在观察 API 上操作,并提供指标和跨度。
2.16 依赖升级
Spring Boot 4.0 移至多个 Spring 项目的新版本:
- Micrometer 1.16
- Micrometer Tracing 1.6
- Reactor 2025.0
- Spring AMQP 4.0
- Spring Batch 6.0
- Spring Data 2025.1
- Spring Framework 7.0
- Spring GraphQL 2.0
- Spring HATEOAS 3.0
- Spring Integration 7.0
- Spring for Apache Kafka 4.0
- Spring LDAP 4.0
- Spring for Apache Pulsar 2.0
- Spring REST Docs 4.0
- Spring Security 7.0
- Spring Session 4.0
- Spring WS 5.0
还更新了许多第三方依赖项,其中一些值得注意的包括:
- Artemis 2.43.0
- Brave 6.3
- Commons Codec 1.19
- Commons Lang3 3.19.0
- Couchbase Client 3.9
- Ehcache3 3.11.1
- Elasticsearch Client 9.1
- Flyway 11.11
- GraphQL 24
- Groovy 5.0
- Gson 2.13.2
- H2 2.4
- Hibernate 7.1
- Hibernate Validator 9.0
- HikariCP 7.0
- HtmlUnit 4.16.0
- Jackson 3.0
- Jakarta Annotation 3.0
- Jakarta Persistence 3.2
- Jakarta Servlet 6.1
- Jakarta Validation 3.1
- Jakarta WebSocket 2.2
- Jakarta WS RS 4.0
- Jedis 6.2.0
- Json-smart 2.6.0
- Jetty 12.1
- Kafka 4.1.0
- Kotlin 2.2.20
- Kotlin Serialization 1.9
- Lettuce 6.8.1.RELEASE
- Liquibase 5.0
- Maven AntRun Plugin 3.2
- Maven Javadoc Plugin 3.12
- Mockito 5.20
- MongoDB 5.6.0
- MSSQL JDBC 13.2
- Native Build Tools Plugin 0.11
- Neo4j Java Driver 6.0
- OpenTelemetry 1.54.0
- Pulsar 4.1.0
- R2DBC H2 1.1
- R2DBC Postgresql 1.1
- Rabbit AMQP Client 5.27
- Selenium 4.37
- Selenium HtmlUnit 4.35
- SnakeYAML 2.5
- TestContainers 2.0
- Tomcat 11.0
- XML Maven Plugin 1.2
2.17 其他改进
除上述更改外,还进行了许多小的调整和改进,包括:
- Micrometer 的指标方面的自动配置现在启用了对带有基于 SpEL 的 ValueExpressionResolver 的 @MeterTag 的支持,适用于 @Counted 和 @Timed 方法。
- 对 MongoDB 的 @ServiceConnection 支持现在支持 Testcontainers 的 MongoDBAtlasLocalContainer。
- 当配置属性绑定因类未找到错误而失败时,改进了错误消息。
- 重新命名了几个反应式自动配置类以保持一致性。
- 从自动配置类中移除了公共成员(常量除外)。自动配置从来不是公共 API,现在通过 Java 机制强制执行。
- 当 spring.threads.virtual.enabled 为 true 时,由 JDK HttpClient 支持的自动配置 HTTP 客户端现在配置为使用虚拟线程。
- 引入了一个 logging.console.enabled 属性。将其设置为 false 可禁用控制台日志记录。
- 改进了 Log4j 3 的 Log4j Core 配置文件检测。
- 优化了 DevTools 重启中的资源查找。
- 将 ScheduledTasksObservabilityAutoConfiguration 重命名为 ScheduledTasksObservationAutoConfiguration 以保持一致性。
- 现在支持使用新的 spring.elasticsearch.api-key 属性通过 API 密钥对 Elasticsearch 进行身份验证。
- 将ConditionalOnEnabledTracing重命名为 ConditionalOnEnabledTracingExport。
- 将属性management.tracing.enabled重命名为 management.tracing.export.enabled。
- SanitizableData.getKey() 和 SanitizableData.getLowerCaseKey() 永远不会返回 null。传递 null 值作为 SanitizableData 的键现在将抛出异常。
- 在 PropertiesConfigAdapter 中引入了专门的接口,以更好地处理空值。
- 将属性spring.dao.exceptiontranslation.enabled重命名为 spring.persistence.exceptiontranslation.enabled。
- 现在可以使用 server.tomcat.resource.cache-max-size 属性配置 Tomcat 静态缓存的最大大小。
- 进一步完善了 JSpecify 空值注释。
- 现在可以在 MANIFEST.MF 中将 Spring-Boot-Jar-Type 设置为 development-tool,以从 uber jars 中排除依赖项。
- 现在将 AWS Elastic Container Service (ECS) 平台识别为一个 CloudPlatform。
- 添加了对 Micrometer 的 @ObservationKeyValue 的支持。
- 进一步完善了 JSpecify 空值注释。
- 将自动配置类导入的配置中的公共成员设为包私有。
- HTML Unit的LocalHostWebClient 和LocalHostWebConnectionHtmlUnitDriver已被UriBuilderFactoryWebClient和UriBuilderFactoryWebConnectionHtmlUnitDriver取代。
- 添加了一个新的配置属性,用于控制是否启用 Elasticsearch 客户端的嗅探器。
3. Spring Boot 4.0.0中的弃用
- OperationMethod(Method method, OperationType operationType) 被弃用,推荐使用 OperationMethod(Method method, OperationType operationType, Predicate optionalParameters)。
- Jackson 2 支持以弃用形式提供。
- org.springframework.boot.env.EnvironmentPostProcessor 被 org.springframework.boot.EnvironmentPostProcessor 替代,但旧接口仍以弃用形式保留以简化升级过程。
参考
