大家好,我是R哥。

最新消息,Spring Boot 一次性发布了 6 个版本:

  • 3.4.0
  • 3.3.6
  • 3.2.12
  • 3.1.14
  • 3.0.18
  • 2.7.23

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

最新的支持版本如下:

从路线图可以看到每个版本的终止时间,每个版本的生命周期只有一年。

Spring Boot 进入了全新的 3.3+ 时代了,3.2.x 及之前的版本也都停止维护了,商业支持的版本也只有 2.7+ 了,2.6.x 以下的版本彻底退出历史舞台,技术变革太快了。。

Spring Boot 3.4.0 新特性

1、最低环境要求

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

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

Spring Boot JDK Spring Maven Gradle
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.12 8 ~ 20 5.3.27+ 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、结构化日志

什么是结构化日志?

一般的日志都是 “非结构” 化的,也就是一段没有任何 “结构” 的日志文本字符串,比如我们在系统中常见的日志信息:

2024-11-25 10:41:05:347 INFO ...

虽然包含了所有关键的信息,但是想要提取其中的特定信息就非常困难,需要解析和搜索这段字符串。

而结构化日志则是一段有明确定义的结构的字符串,可读性好,通用是 JSON 格式,如以下日志:

{
    "timestamp": "2024-11-25 10:41:05:347",
    "level": "INFO",
    ...
}

这样获取日志信息是不是方便多了?

Spring Boot 中的结构化日志

Spring Boot 3.4 支持结构化日志记录,并支持以下开箱即用的 JSON 格式:

  • Elastic Common Schema (ecs)
  • Graylog Extended Log Format (gelf)
  • Logstash(logstash

启用结构化日志记录配置:

参数 说明
logging.structured.format.console 用于控制台输出
logging.structured.format.file 用于文件输出

配置示例:

logging:
  structured:
    format:
      console: ecs
      file: ecs

结构化日志配置支持上面所说的 ecs、gelf、logstash 日志。

推荐看看我写的更多 Spring Boot 教程:https://www.javastack.cn/spring/spring-boot/

3、定义附加的 Bean

Spring Boot 3.4 开始,当类型匹配时,基于 Bean 的条件现在将忽略任何不是默认候选者的 Bean。

通过声明 bean 不是默认候选者,如:

@Bean(defaultCandidate = false)
public class Xxx {

}

然后在定义自动配置类型的 bean 时,如果存在相同类型的 bean,它就会被忽略,从而不会导致自动配置的 bean 注册失败

比如在同一个应用程序中要使用两个数据源 Bean,或者其他两个相同类型的 Bean 时,这样就特别有用,还能简化配置。

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

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

4、扩展虚拟线程

Spring Boot 3.4 开始,如果启用了虚拟线程,以下组件将使用虚拟线程:

  • OtlpMeterRegistry
  • Undertow web server

另外,通过 Spring Integration 集成的任务调度器(TaskScheduler)现在也是虚拟线程感知的,即使在 @EnableScheduling 在没有开启的状态下。

5、Docker Compose 和 Testcontainers 改进

Docker Compose 现在支持多个 Docker Compose 配置文件,并且添加了几个新的命令行参数:

  • spring.docker.compose.start.argumentsspring.docker.compose.stop.arguments 参数可用于指定在启动和停止服务时传递给 Docker Compose 子命令的其他命令行参数。

  • spring.docker.compose.arguments 参数支持传递参数给 Docker Compose。

另外,Testcontainers 测试容器也得到了各种改进,比如添加了对 org.testcontainers.kafka.KafkaContainer 、Redis Stack 和 Redis Stack Server 的支持。

6、Actuator 增强

可插拔的 Actuator 暴露器

Spring Boot 3.4 支持扩展 Spring Boot 以可插拔的方式公开 Actuator 端点,并且添加了一个 EndpointExposureOutcomeContributor 接口,它会影响到 @ConditionalOnAvailableEndpoint 注解的条件控制。

此扩展可以更轻松地提供类似于我们现有的 Cloud Foundry 支持的其他平台集成。

SSL信息和健康检查

如果你使用了 SSL bundles,现在在 /actuator/info 下添加了一个新端点,用来显示 SSL 信息,比如证书有效期、颁发者、主题等。

这个端点还能显示即将过期的证书,这样就能提醒我们不定期更新证书,它还提供了一个提醒阈值配置参数:

management.health.ssl.certificate-validity-warning-threshold

另外,它还添加了监控 SSL 证书的健康检查,如果证书无效,则会将状态设置为中止服务(OUT_OF_SERVICE)。

计划任务端点显示更多信息

计划任务 /actuator/scheduledtask 端点现在添加了更多关于计划任务的元数据信息,比如:下一次计划执行时间、上次执行时间、状态和异常等。

7、镜像构建改进

Spring Boot 现在默认使用的是 paketobuildpacks/builder-jammy-java-tiny,该构建器支持 ARM 和 x64 平台开箱即用。

在 Maven 和 Gradle 插件中添加了一个用于构建 OCI 映像的 trustBuilder 选项,它控制了 CNB 生命周期的调用方式,从而在使用来自不受信任来源的构建器时提供更高的安全性。

默认情况下,来自 Paketo、Heroku 和 Google 的构建器是受信任的。

在 Maven 和 Gradle 插件中还添加了一个用于构建 OCI 映像的 imagePlatform 选项,此选项可用于指定为运行 CNB 构建包而拉取的任何 CNB 构建器、运行和构建包映像的操作系统和体系结构。

8、MockMvcTester 自动配置

支持当 AssertJ 在类路径下时自动配置 MockMvcTester,有了 MockMvcTester,我们就能使用流式 API 定义请求和断言。

MockMvcTester 也是 MockMvc 的替代方案,它可以代替 MockMvc 所能使用到的任何场景。

9、RestClient 和 RestTemplate

RestClient 和 RestTemplate 的自动配置,添加了对 Netty 响应式的 HttpClient HTTP 客户端和 JDK 的 HttpClient HTTP 客户端的支持。

按照优先顺序分别是:

  • Apache HTTP Components (HttpComponentsClientHttpRequestFactory)
  • Jetty Client (JettyClientHttpRequestFactory)
  • Reactor Netty HttpClient (ReactorClientHttpRequestFactory)
  • JDK HttpClient (JdkClientHttpRequestFactory)
  • Simple JDK HttpURLConnection (SimpleClientHttpRequestFactory)

需要注意的是,如果在类路径上没有HTTP客户端库,这可能会导致使用 JdkClientHttpRequestFactory,而以前使用的是 SimpleClientHttpRequestFactory。

可以通过设置 spring.http.client.factory 参数来选择特定的 HTTP 客户端,支持的值有:http-components、jetty、reactor、jdk 和 simple。

10、优雅关机

Spring Boot 3.4 开始,现在默认启用嵌入式 Web 服务器的优雅关机,包括:Jetty、Rector Netty、Tomcat 和 Undertow

如果需要恢复之前的默认行为,可以设置以下参数:

server.shutdown: immediate

11、更多

1)Spring Boot 不再依赖 OkHttp,OkHttp 的依赖也被移除了。

2)Apache HTTP 组件已更改 HttpClient 中与 HTTP/1.1 TLS 升级相关的默认值。

3)配置属性的 Bean 验证有变动,如果要验证级联到嵌套属性,则根据需要添加 @Valid 注解。

4)当在 @Bean 方法上使用 @ConditionalOnBean@ConditionalOnMissingBean 并设置 annotation 属性时, @ConditionalOnBean@ConditionalOnMissingBean 的行为已更改。

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

总结

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

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

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

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

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

有需要的直接扫码订阅:

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

等更新到 Spring Boot 3.5+,本课程会涨价到 499 元,早订阅,早学习,早受益。

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

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

发表回复

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