大家好,我是R哥。

就在前几天,Spring Boot 3.5.0 正式发布了:

最新的支持版本如下:

3.2.x 在前几天也停止维护了,很神奇的是,3.1.x 及以下的停更版本居然也发布 bug 更新包了。

从路线图可以看到每个版本的终止时间,每个版本的生命周期只有一年,3.3.x 以下的版本停止免费维护了,3.3.x 还有一个月也要停止维护了,商业支持的 3.x 最高版本版本 3.1.x、2.x 为 2.7.x

Spring Boot 进入了全新的 3.4+ 时代了,2.6.x 以下的版本彻底退出历史舞台,4.0 都快要来了,技术变革太快了。。

Spring Boot 3.5.0 新特性

1、最低环境要求

Spring Boot 3.0.0 开始支持并最低要求 Java 17,目前的新版本也陆续开始支持 Java 21 ~ 24 了。

对 Java 开发环境的要求对比表:

Spring Boot JDK Spring Maven Gradle
3.5.0 17 ~ 24 6.2.7+ 3.6.3+ 7.6.4+,8.4+
3.4.0 16 ~ 23 6.2.0+ 3.6.3+ 7.6.4+,8.4+
3.3.0 17 ~ 22 6.1.8+ 3.6.3+ 7.5+,8.x
3.2.0 17 ~ 21 6.1.1+ 3.6.3+ 7.5+,8.x
3.1.0 17 ~ 20 6.0.9+ 3.6.3+ 7.5+,8.x
3.0.0 17 ~ 19 6.0.2+ 3.5+ 7.5+
2.7.18 8 ~ 21 5.3.31+ 3.5+ 6.8.x, 6.9.x, 7.x, 8.x

支持 Java 8 的最后一个 Spring Boot 2.x 系列版本早已已经退伍啦,Java 17 的新时代彻底到来。

如果你还停留在 Java 8 就 OUT 了,过去一两年,Java 8 采用率腰斩,Java 17 暴涨 430%!!

R哥制作的《Java 新特性实战课》都可以报名学起来,好课不贵,199 元永久学习,如后续出了 Java 21 及更多版本新内容都能免费更新。

2、结构化日志记录改进

在《Spring Boot 3.4 版本》中出的新功能结构化日志,Spring Boot 3.5 又对它进行改进了:

  • 支持自定义结构化日志堆栈跟踪,可以自定义写入结构化日志的堆栈跟踪,以限制其大小或以不同的格式进行打印。可以使用 logging.structured.json.stacktrace.* 属性配置堆栈跟踪输出。
  • ECS 结构日志的 JSON 输出已更新为使用嵌套格式,这将提高与使用 JSON 的后端之间的兼容性。
  • ECS 结构化日志格式,现在在 tags 字段中添加了 Logback 和 Log4j 的标记。

3、服务连接支持 SSL

Spring Boot 3.5 已经支持为选定的服务连接添加客户端 SSL 支持,以下服务连接支持此功能:

  • Cassandra
  • Couchbase
  • Elasticsearch
  • Kafka
  • MongoDB
  • RabbitMQ
  • Redis

另外,Testcontainers 和 Docker Compose 集成也进行了更新,也允许进行 SSL 配置:

  • 对于 Testcontainers,可以使用新的注解;
  • 对于 Docker Compose,可以使用标签。

4、从环境变量加载属性

虽然之前的版本已经可以从环境变量加载单个属性,但现在,Spring Boot 3.5 开始,可以从单个环境变量加载多个属性

比如,现在可以定义一个多行环境变量 USER_CONFIGURATION ,可以包含以下内容:

user.name=John
user.age=18
user.sex=1
...

然后可以通过使用 env: 前缀导入:

spring.config.import=env:USER_CONFIGURATION

Environment 中,就可以找到 user.nameuser.age 等其他多个属性了,也就是说,当有多个属性值的时候,可以不用配置多个环境变量了,一个环境变量搞定。

5、AsyncTaskExecutor 与自定义 Executor

AsyncTaskExecutor 是 Spring 框架提供的异步任务执行器接口,用于执行异步方法或任务。它是 Spring 对 Java 原生 Executor 的增强,提供了更高层次的封装,常用于异步方法调用(如 @Async)或手动提交任务。

如果自定义的 Executor 的 Bean 存在,Spring Boot 3.5 现在可以自动配置 AsyncTaskExecutor,只需要将 spring.task. execute.mode 属性的值设置为 force。

在这种模式下运行时,它确保所有集成(包括常规的 @Async 处理)都使用自动配置的执行器,除非定义了 AsyncConfigurer 相关的 Bean。

6、Bean 后台初始化支持自动配置

Spring Boot 3.5 现在支持自动配置一个名为 bootstrapExecutor 的 Bean,在还没有的相关 Bean 情况下才自动配置,以支持 Bean 在后台完成初始化。

要实现这一点,需要在上下文中有一个名为 applicationTaskExecutor 的 Bean,当然也可以定义自定义 Executor bean,这样就能让 Bean 后台初始化可以开箱即用。

7、通过注解注册过滤器和 Servlet

之前注册过滤器和 Servlet 普通使用的是 ServletRegistrationBeanFilterRegistrationBean 方式,Spring Boot 3.5 祭出了两个注解替代方案:

  • 使用 @ServletRegistration 注册 Servlet
  • 使用 @FilterRegistration 注册 Filter

如下例所示:

@Configuration(proxyBeanMethods = false)
public class FilterConfiguration {

    @Bean
    @FilterRegistration(name = "encoding-filter", urlPatterns = "/*", order = 0)
    public EncodingFilter encodingFilter() {
        return new EncodingFilter();
    }

}

此外,对 FilterRegistrationBean 的行为也进行了调整,以前,你可以将一个空的 DispatcherType 集传递给 setDispatcherTypes 方法,然后再将它传递给服务器。

现在,它的行为与调用 setDispatcherTypes(null) 作用相同,将其与 FilterRegistration 注解的功能保持一致。

8、自动配置的 TaskExecutor 名称

以前,Spring Boot 自动配置了一个 TaskExecutor ,其中包含 taskExecutorapplicationTaskExecutor Bean 名称。

在 Spring Boot 3.5 这个版本中,只提供了 applicationTaskExecutor bean 名称,请求按名称自动配置的 Executor 的代码应该适应使用 applicationTaskExecutor

如果你的系统依赖这种方式,还想和过去保持兼容,你也可以使用 BeanFactoryPostProcessor 来添加别名,如下面的例子所示:

@Configuration
public class MyConfiguration {

    @Bean
    static BeanFactoryPostProcessor taskExecutorAliasBeanFactoryPostProcessor() {
        return (beanFactory) -> beanFactory.registerAlias("applicationTaskExecutor", "taskExecutor");
    }

}

9、Redis 配置变更

当配置 spring.data.redis.url 时,使用的 Redis 数据库由 URL 决定。如果 URL 没有指定数据库,则使用默认值 0

当配置 spring.data.redis.url 时,现在忽略 spring.data.redis.database 属性,使其行为与主机、端口、用户名和密码属性保持一致。

另外,增加使用 spring.data.redis.lettuce.read-from 属性配置 ReadFrom 的支持。

10、Prometheus Pushgateway 配置变更

将指标推送到 Prometheus Pushgateway 现在需要 io.prometheus:prometheus-metrics-exporter-pushgateway 而不是 io.prometheus:simpleclient_pushgateway 了。

另外,新客户端的 Pushgateway 支持也可能需要更改配置,如果使用 management.prometheus.metrics.export.pushgateway.base-url ,需要替换为 management.prometheus.metrics.export.pushgateway.address ,并将值调整为 host:port 的形式。

为了支持新的 Pushgateway 客户端,添加了三个新属性:

  • management.prometheus.metrics.export.pushgateway.format:将 format 属性设置为 text 以文本形式推送指标,而不是使用 protobuf。
  • management.prometheus.metrics.export.pushgateway.scheme:将 scheme 属性设置为 https ,支持在推送指标时使用 SSL。
  • management.prometheus.metrics.export.pushgateway.token:设置 token 属性,而不是现有的 usernamepassword 属性,以使用基于令牌的身份验证。

11、更多

1)执行器端点 heapdump 现在默认为 access=NONE,其目的是帮助减少错误配置应用程序泄露敏感信息的可能性。

2)属性 .enabled 的支持的值已经收紧了,现在必须是 truefalse

3)配置文件命名规则在此版本中得到了加强,配置文件现在只能包含 - (破折号)、 _ (下划线)、字母和数字。此外,配置文件不允许以 -_ 开头或结尾。

4)TestRestTemplate 现在和常规的 RestTemplate 一样使用相同的重定向设置,HttpOption.ENABLE_REDIRECTS 选项也已弃用。

5)大量 Spring 库和第三方类库都得到了更新,还有一些废除项。

总结

Spring Boot 3.5 这个版本的变化还挺大的,增加了不少实用功能,很多功能也都得到了增强,做技术的真要时刻保持对新技术的渴望啊,不然都跟不上时代的步伐了。

Spring Boot 这波操作,既是顺应大环境对现代 Java 的需求,又在细节上做了许多微创新。

从环境支持的 Java 版本不断提升,到结构化日志、服务连接 SSL、注解式 Servlet 和 Filter 注册、Redis 配置调整、Pushgateway 的更新……每一项都体现出了官方对开发体验和生产效率的深度思考。

话说你们现在用的什么版本呢?

特别是对很多还停留在 Spring Boot 2.x 或 Java 8 的朋友来说,是时候认真考虑升级了,因为这些新功能不只是新,更意味着性能提升、安全增强、开发便捷、生态进化,而这正是我们做后端开发最核心关注的方向。

Spring Boot 最新最全的实战代码已上传 Github:

https://github.com/javastacks/spring-boot-best-practice


如果你还没用过 Spring Boot,这里推荐下我的《Spring Boot 核心技术课》,17 个模块,几乎涉及所有核心技术,包括底层实现原理及代码实战,知识点非常齐全,助你快速打通 Spring Boot 的各个环节。

有需要的直接扫码订阅:

一次订阅,永久学习,免费更新。

等课程内容更新到 Spring Boot 4.x,本课程会涨价到 499 元,早订阅,早学习,早受益。

好了,今天的分享就到这里了,后续R哥也会继续关注并分享更多的 Spring Boot 资讯和干货,关注公众号Java技术栈第一时间推送。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注