? ? ? ? 作为进入IT开发领域已经十多年的我而言,IT开发领域中技术不断更新迭代所带来的影响深有体会。作为技术人员必须紧跟技术市场,否则也不能走远。人们大都习惯生活在自己熟悉的安逸区,很少愿意主动寻找新挑战。目前后端技术栈中主流的语言依然是Java(这是Java程序员的福音),而Java作为服务器端使用最广泛的编程语言一直都没有停止更新。SpringBoot就是大多数Java程序员每天都会接触到的框架,不知道大家用得SpringBoot是否还是2.x版本呢?JDK还是8的版本呢?Tomcat还是8的版本呢?本文下面将说一说Spring Boot的版本情况以及SpringBoot新版本带来的新特性。
????????2018年2月28日Spring Boot进入2.0时代,距今已经快6年时间了。虽然已过去五年多的时间,但Spring Boot 2.x的版本在市场上的使用情况依然非常广泛。它被广泛用于构建和部署各种类型的应用程序,包括Web应用程序、微服务、RESTful API和批处理作业等。Spring Boot 2.x主要有以下几个主流使用的原因:
1. 简化配置:Spring Boot2.x提供了自动配置的特性,可以根据项目的依赖自动配置相应的组件和功能,大大减少了配置的工作量。
2. 快速开发:Spring Boot2.x集成了许多常用的框架和工具,如Spring MVC、Spring Data JPA、Spring Security等,开发人员可以直接使用这些组件进行快速开发,提高开发效率。
3. 微服务支持:Spring Boot2.x对微服务架构提供了良好的支持,可以轻松构建和管理微服务应用,同时提供了丰富的监控和管理功能。
4. 对Java8的支持:Spring Boot2.x对Java8及以上版本进行了全面支持,可以充分利用Java8的新特性,如Lambda表达式、Stream API等,提高代码的可读性和简洁性。
5. 社区活跃:Spring Boot是由Spring官方主导的项目,拥有庞大的开发者社区,可以获取到丰富的技术文档和开源代码,可以更好地解决问题和学习新技术。
6.?内嵌Servlet容器:Spring Boot 内置了多个常用的 Servlet 容器,如Tomcat、Jetty等,可以方便地将应用程序打包为一个独立的可执行文件,减少了对应用服务器的依赖,简化了部署流程。
7. 提供了大量的Starter依赖:Spring Boot 提供了大量的 Starter 依赖,开发者只需要添加一个特定的Starter依赖,就可以引入相关的库、配置和其他依赖项,大大减少了配置的复杂性。
8. 良好的生态系统:Spring Boot 是基于 Spring 框架的,可以很好地集成和使用 Spring 生态系统的其他组件,如 Spring MVC、Spring Security、Spring Data等。同时,Spring Boot 也拥有强大的社区支持,可以方便地获取到各种技术支持和解决方案。
9. 可监控性:Spring Boot 提供了一套完整的监控和管理功能,可以方便地进行应用程序的监控和管理,如健康检查、指标收集、日志监控等。
????????总的来说,Spring Boot 2.x的主流使用原因是它提供了简化开发、内嵌Servlet容器、丰富的Starter依赖、良好的生态系统和可监控性等优点,使得开发者可以更加高效、便捷地开发和部署应用程序。也因如此,Spring Boot 2.x的版本是目前最受开发者们所广泛使用的。
????????Spring 官方于 2022 年 1 月 20 日发布 Spring Boot 3.0.0-M1 版本,预示开启了 Spring Boot 3.0 的里程碑。2022年11月24号,Spring Boot 3.0 发布了第一个正式的 GA 版本。经过半年的沉淀 Spring Boot 3.1于2023年5月18日正式发布。
? ? ? ? 通过Spring官网可以看到,Spring Boot最新版本是3.2.x于2023年11月23日正式发布。(你还在用Spring哪个版本呢)
????????截至2024-01-16今天时间轴可以看出,Spring官方已经停止维护Spring Boot 3.0.x以下的版本了,商业支持的版本也只支持?2.6.x以上的版本了。
?
一个全新的通用全栈虚拟机
,并具有高性能、跨语言交互等逆天特性,支持云原生,官网:GraalVM?
????????SpringBoot3将强力合体Java17,采用全新的Spring6版本,Maven支持也提高到了3.5、Gradle提高到了7.3。版本管理器默认也换成了grandle,grandle国内的下载速度慢。?(同时发布更新的还有 2.7.x 和 2.6.x 两条版本线,Spring Boot 是我见过的发版最守时的技术框架之一)
????????Spring Boot 3.0 现已正式发布,它包含了 12 个月以来 151 个开发者的 5700 多次代码提交。它也是第一个支持?Spring Framework 6.0 和 GraalVM?
的 Spring Boot GA 版本,同时也是第一个基于 Java 17 的 Spring Boot 版本,以 Jakarta EE 9 为基准并支持 Jakarta EE 10。同时借助于 GraalVM 支持了 AOT 和 Native Image。
????????Spring Boot 3.0 使用 Java 17作为最低版本,如果你目前使用的是 Java 8或 Java 11,那么需要升级先升级 JDK,并且新版本已通过 JDK 19 进行了测试。如果你要使用 Native Image 特性,要使用 GraalVM 22.3 以上和 Native Build Tools Plugin 0.9.17 或更高的版本。
????????这里不建议直接从低于 Spring Boot 2.7 的版本直接升级到 Spring Boot 3.0。不然新特性和 API 变更太多,就需要你修改大量的配置,升级路径会过于陡峭。建议通过小版本号分阶段升级到 2.4、2.6、2.7,最后再到 3.0。
????????Spring Boot3.0 下依赖组件的版本要求也不尽相同,比如 Spring Boot Kafka Starter 可能对 Kafka 有什么要求,这要求你进行充分评估。Spring Cloud 体系应该在对应的 Spring Boot 3.0 体系发布后进行升级。一旦上面的工作准备完毕,你就可以开始尝试升级到 Spring Boot 3.0 了。
????????Spring Boot 3.0最低要求 Java 17
,并向上兼容支持 Java 19。所以,如果你想升级 Spring Boot 3.0,请确保你的 JDK 版本是否符合要求,毕竟现在大部分人还是用的 Java 8,升级 JDK 版本不是一件小事。
????????另外,Spring Boot 3.0 已将所有底层依赖项从 Java EE 迁移到了 Jakarta EE API,基于 Jakarta EE 9 并尽可能地兼容 Jakarta EE 10。因为早在几年前 Java EE 已经正式更名为 Jakarta,所以,所有相关的名称都变了,包括包名,所以使用了 Java EE 的应用改动也不小。
????????Spring Boot 3.1.0 需要Java 17,并且兼容 Java 20(包括 Java 20)。 还需要Spring Framework 6.0.9或更高版本。
????????除此之外,Spring Boot 管理的大量第三方的技术依赖也有大幅度的的升级,具体可以参考官方版本发布文档:
????????在 Spring Boot 3.0 中,一些配置属性被重新命名/删除了,开发人员需要相应地更新他们的application.properties或者application.yml。为了帮助你做到这一点,Spring Boot 3.0 提供了一个spring-boot-properties-migrator模块
。一旦作为依赖关系添加到你的项目中,它不仅会在启动时分析你的应用程序的环境并打印诊断结果,而且还会在运行时为你临时迁移属性。把下面这个加入pom.xml以帮助你升级兼容配置属性:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<scope>runtime</scope>
</dependency>
完成迁移之后,务必要移除spring-boot-properties-migrator依赖。
????????Spring Boot 3.0 通过 Micrometer 和 Micrometer 追踪提高应用可观察性,支持集成 Micrometer 1.10+,引入了的全新的可观察 API 并自动配置 Micrometer 追踪,包括对 Brave、OpenTelemetry、Zipkin 和 Wavefront 组件的支持。
????????使用 Micrometer 可观察 API 时,完成观察后,可将观察数据主动报告给 Zipkin 等组件,并支持自定义追踪参数配置,这个新特性可以更好地帮助我们了解并监控应用的健康状况。
????????由于 Java EE 已经变更为 Jakarta EE,包名以 javax开头的需要相应地变更为jakarta。这里建议通过 Intellij IDEA 2021.2 提供的内置功能批量处理即可:
????????当然你也可以手动去变更包名。
????????Spring Boot 3.0 有一些关键改变,这些改变将与大多数应用程序有关。所以开发者要仔细阅读这些变更。
自动配置文件变更Spring Boot 2.7 引入了一个新的文件:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
用于注册自动配置,同时保持与 spring.factories 中注册的向后兼容。Spring Boot 3.0 发布后,spring.factories已经被移除,只能通过imports文件来注册自动配置。
????????GraalVM 是 Oracle 在 2018 年发布的一个全新的通用全栈虚拟机
,并具有高性能、跨语言交互等逆天特性,不仅支持了 Java、Scala、Groovy、Kotlin 等基于 JVM 的语言,以及 C、C++ 等基于 LLVM 的语言,还支持其他像 JavaScript、Ruby、Python 和 R 语言等。
????????Spring Boot 3.0 应用现在可以支持转换为 GraalVM 原生镜像了,这可以提供显著的内存和启动性能改进,能支持 GraalVM 原生镜像也是整个 Spring 产品组合中的一项重大能力的提升。
Spring Boot 3.0 最低支持 Graal 22.3+ 和 Native Build Tools Plugin 0.9.17+。
????????Spring Native 也是升级的一个重大特性,支持使用 GraalVM 将 Spring 的应用程序编译成本地可执行的镜像文件,可以显著提升启动速度、峰值性能以及减少内存使用。
Spring Boot 3.0 构建基于 Spring Framework 6 之上,需要使用 Spring Framework 6。该版本中升级的其他 Spring 项目包括:
Spring Boot 3.0 已经从?Java EE
?升级为?JakartaEE API
。尽可能选择?JakartaEE10
?兼容的依赖:
另外,还升级了第三方 jar 包的最新稳定版本,其中一些值得注意的依赖升级包括:
这次升级,包含了一些对 Log4j2 的扩展支持。可以参考官方文档:概述(Spring Boot 3.2.1 API)
配置文件增强
比如下面针对不同环境的配置方式。
<SpringProfile name="staging">
<!-- configuration to be enabled when the "staging" profile is active -->
</SpringProfile>
<SpringProfile name="dev | staging">
<!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</SpringProfile>
<SpringProfile name="!production">
<!-- configuration to be enabled when the "production" profile is not active -->
</SpringProfile>
Spring 环境属性增强
支持在 Log4j2配置中引用 Spring 环境中的属性,使用?Spring:
?前缀。
<Properties>
<Property name="applicationName">${spring:spring.application.name}</property>
</Properties>
系统属性增强
Log4j2现在支持更多可配置的?System.properties
?。比如,可以使用?log4j2.skipJansi
?系统属性来配置?Console Appender
?是否在 Windows 上使用?Jansi
?输出流。
在 Log4j2 初始化之后加载的所有System.properties
都可以从?SpringEnvironment
?拿到。比如上面的举例一样,可以把log4j2.skipJansi = false
?配置到?application.properties
?中。
以前如果希望属性绑定到类中,我们通过使用@ConfigurationProperties
和@ConstructorBinding
注解可以做到。
新版本针对该注解做了优化,当使用构造函数绑定@ConfigurationProperties
?时,如果类只有一个参数的构造函数,则不再需要@ConstructorBinding
注解。
如果有多个构造函数,那么仍然需要使用@ConstructorBinding
来告诉 Spring Boot 应该使用哪个构造函数。
Spring Boot 3.0 支持 Micrometer 1.10 中引入的新的 Observation API,新的?ObservationRegistry
提供一个 API 就可以创建?metrics
和?trace
,新版本 SpringBoot 现在将会自动装配ObservationRegistry
,并且可以使用ObservationRegistryCustomizer
进一步定制化ObservationRegistry
。?
SpringBoot 现在自动装配Micrometer Tracing?,包括对 Brave, OpenTelemetry, Zipkin 和 Wavefron 的支持。
另外,当引入io.micrometer:micrometer-registry-otlp
包之后,?OtlpMeterRegistry
也会自动装配。?
如果存在 Prometheus 依赖和?Tracer
?Bean,将会自动装配SpanContextSupplier
,SpanContextSupplier
将会把 metrics 关联到 trace,因为它会把当前的 traceID 和 spanID 保存到 Prometheus 的 Example 中。
Spring Data JDBC的自动装配现在更加灵活,Spring Data JDBC 所需的几个自动装配的?Bean
现在是有条件的,可以通过定义相同类型的Bean来替换,可以替换的Bean
类型如下:
org.springframework.data.jdbc.core.JdbcAggregateTemplate
org.springframework.data.jdbc.core.convert.DataAccessStrategy
org.springframework.data.jdbc.core.convert.JdbcConverter
org.springframework.data.jdbc.core.convert.JdbcCustomConversions
org.springframework.data.jdbc.core.mapping.JdbcMappingContext
org.springframework.data.relational.RelationalManagedTypes
org.springframework.data.relational.core.dialect.Dialect
现在可以通过设置spring.kafka.listener.async-acks=true
来开启 Kafka 的异步 ACK,并且需要设置spring.kafka.listener.async-mode
为manual
?or?manual-immediate
。
支持新版本的 ES JAVA 客户端自动装配,可以通过属性spring.elasticsearch.*
来配置。
如果没有 Netty Reactor、Jetty reactive client 和 Apache HTTP client ,将自动装配JdkClientHttpConnector
,这允许WebClient
和 JDK 的HttpClient
一起使用。
现在任何@SpringBootConfiguration
中的main
方法都可以使用@SpringBootTest
注解,但是需要将@SpringBootTest
的useMainMethod
属性设置为UseMainMethod.ALWAYS
?或者UseMainMethod.WHEN_AVAILABLE
。
除了上面列出的改变之外,还有一些小的调整和优化,包括:
Spring Framework6
中移除CommonsMultipartResolver
之后,对它的支持也被移除了。spring.mvc.ignore-default-model-on-redirect
spring.mvc.webjars-path-pattern
?、?spring.webflux.webjars-path-pattern
自定义server.Tomcat.Remoteip.trust-proxy
?配置。ValidationConfigurationCustomizer
?来自定义 Bean 的校验。Log4jBridgeHandler
?现在用于将基于 JUL 的日志路由到 Log4j2,而不是通过 SLF4J 路由。MeterBinder
?接口的 Bean 现在只有在所有单例 Bean 初始化之后才绑定到meter registries。SpanCustomizer
?bean 现在会自动装配JvmCompilationMetrics
?现在会自动装配。DiskSpaceHealthIndicator
?现在其日志消息中包含路径及其健康详细信息。DataSourceBuilder
。spring.data.mongodb.additional-hosts
?属性为 MongoDB 配置多个 host。spring.elasticsearch.socket-keep-alive
?属性配置 Elasticsearch 的 socketKeepAlive 属性。spring-rabbit-stream
?时,RabbitStreamTemplate
?和?Environment
?现在将自动装配,无论?spring.rabbitmq.listener.type?
是否是?stream
。spring.kafka.admin.modify-topic-configs?
进行修改。WebDriverScope
?和?WebDriverTestExectionListener
?现在是 public,以方便在自定义测试配置中使用?WebDriver
。ConstructorBinding
?已经从?org.springframework.boot.context.properties
?包修改为?org.springframework.boot.context.properties.bind
。JsonMixinModule
?扫描的构造函数。ClientHttpRequestFactorySupplier
?应该替换为?ClientHttpRequestFactories
。RestTemplateExchangeTagsProvider
,?WebClientExchangeTagsProvider
,?WebFluxTagsProvider
,?WebMvcTagsProvider
和相关类已经被ObservationConvention
所取代。HealthContributor
@Configuration 上的无参构造函数已被弃用。DefaultTestExecutionListenersPostProcessor
?和?SpringBootDependencyInjectionTestExecutionListener
?已被弃用,转而使用 Spring 框架的?ApplicationContextFailureProcessor
。management.metrics.export.<product>
,推荐使用?management.<product>.metrics.export
。management.prometheus.metrics.export.pushgateway.shutdown-operation
支持 POST@AutoConfigureMetrics
?已被弃用,推荐使用@AutoConfigureObservability
。?