SpringBoot3.0现已正式发布,包含过去12个月来自151位开发者的5700多份代码提交。这是自4.5年前发布2.0以来,SpringBoot的第一次重大修订。它也是第一个支持SpringFramework6.0和GraalVM的SpringBootGA版本,也是第一个基于Java17、基于JakartaEE9、支持JakartaEE10的SpringBoot版本。同时支持AOT和借助GraalVM的本机图像。3.0升级指南如果你想尝试SpringBoot3.0,不妨参考一下胖哥精心准备的升级指南。要升级JDK,必须先将JDK升级到JDK17。如果要使用NativeImage功能,则必须使用GraalVM22.3或更高版本和NativeBuildToolsPlugin0.9.17或更高版本。平滑升级不建议直接从低于SpringBoot2.7的版本升级到SpringBoot3.0。否则,过多的新特性和API变更会需要你修改大量的配置,升级路径会过于陡峭。建议通过小版本号分阶段升级到2.4、2.6、2.7,最后升级到3.0。依赖评估SpringBoot3.0下依赖组件的版本要求也不同。比如SpringBootKafkaStarter可能对Kafka有什么要求,这就需要你去充分评估了。SpringCloud系统应该在对应的SpringBoot3.0系统发布后升级。升级到SpringBoot3以上工作准备就绪后,就可以开始尝试升级到SpringBoot3.0了。配置属性兼容性在SpringBoot3.0中,一些配置属性被重命名/删除,开发者需要相应地更新他们的application.properties或application.yml。为了帮助您做到这一点,SpringBoot3.0提供了一个spring-boot-properties-migrator模块。一旦作为依赖项添加到您的项目中,它不仅会在启动时分析您的应用程序环境并打印诊断信息,还会在运行时为您临时迁移属性。将以下内容添加到pom.xml以帮助您升级兼容的配置属性:org.springframework.bootspring-boot-properties-migratorruntime完成迁移后,一定要移除spring-boot-properties-migrator依赖。JakartaEE由于JavaEE已经改为JakartaEE,所以需要将javax开头的包名相应改为jakarta。这里推荐使用IntellijIDEA2021.2自带的批处理功能:当然你也可以手动改包名。升级的关键变化SpringBoot3.0有一些与大多数应用相关的关键变化。所以开发者应该仔细阅读这些变化。不再支持图片Banner现在SpringBoot3.0自定义Banner只支持文字类型(banner.txt),不再支持图片类型。日志日期格式更改Logback和Log4j2日志消息的日期和时间部分的默认格式已更改,以符合ISO-8601标准。新的默认格式yyyy-MM-dd'T'HH:mm:ss.SSSXXX使用T来分隔日期和时间而不是空格字符,并在末尾添加时区偏移量。LOG_DATEFORMAT_PATTERN环境变量或logging.pattern.dateformat属性可用于恢复之前的默认值yyyy-MM-ddHH:mm:ss.SSS。ConstructingBinding注解配置属性类注解@ConfigurationProperties默认不再需要使用@ConstructorBinding来标记构造,应该从配置类中移除,除非配置类有多个构造函数显式配置属性绑定。YamlJsonParser被删除,因为SnakeYAML的JSON解析与其他解析器实现不一致。如果直接使用YamlJsonParser,请迁移到其他JsonParser实现。自动配置文件更改SpringBoot2.7引入了一个新文件:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports用于注册自动配置,同时保持与spring.factories中注册的向后兼容性。SpringBoot3.0发布后,spring.factories被移除,只能通过imports文件注册自动配置。Web应用更改路径匹配现在调整了SpringMVC和SpringWebflux的路径匹配规则。默认情况下,尾部斜杠/的匹配机制会和以前不同:3.0之前的/foo/bar等同于/foo/bar/3.0以后,/foo/bar和/foo/bar/deprecated是不同的配置server.max-http-header-sizeserver.max-http-header-size已经弃用,现在用server.max-http-request-header-size代替,现在这个属性只能配置大小requestheader,不再限制部分web容器的responseheader的大小。如果需要限制响应头的大小,请通过自定义WebServerFactoryCustomizer来实现。优雅关闭阶段更改优雅关闭由SmartLifecycle实现,从SmartLifecycle.DEFAULT_PHASE-2048开始,并在SmartLifecycle.DEFAULT_PHASE-1024停止Web服务器。任何参与优雅关闭的SmartLifecycle实现都应相应更新。Jetty由于Jetty目前不支持Servlet6.0,所以使用Jetty的开发者需要将JakartaServlet的版本降到5.0。与数据访问相关的更改spring.data前缀已为SpringData项目保留。如果使用SpringData项目的子项目,application.yaml中的相关配置属性需要做相应的修改。比如spring.redis现在需要改成spring.data.redis。数据访问相关的组件现在都使用比较新的版本:Flyway更新到9.0,Hibernate更新到6.1R2DBC,Mongodb更新到1.0。另外去掉了Flapdoodle内嵌MongoDB的自动配置,需要开发者自行引入。ElasticsearchElasticsearch的Rest客户端采用了新的API实现,旧的自动配置和SpringDataElasticsearch中的旧客户端API已被删除。SpringSecurity相关的改动,胖哥稍后会独立整理分享。其他变化的可观察性,measurementtracking,Maven,Gradle也有不同程度的变化。有需要的可以查看官方的Spring-Boot-3.0-Migration-Guide。记得收藏这篇文章,后续胖哥会深入到Spring6.0和SpringBoot3.0的细节。