是时候为Spring Boot 3.0做准备了
2018年2月28日Spring Boot进入2.0时代,距今已经超过4年了。 2022 年 11 月 Spring Boot 3.0 将正式发布,它将基于 Spring Framework 6.0,并且需要 Java 17 或更高版本,同时它也将是Jakarta EE 9的第一个 Spring Boot 版本。还有六个月的时间留给开发者来过渡到 Spring Boot 3.0,今天胖哥将告诉你一些方法,以便于将来快速迁移到3.0。
Java 17
Java 17 将是继 Java 8 以来最重要的LTS版本,是 Java 社区八年努力的成果。包含了很多重要的改进,Java 17也是目前性能最强的LTS版本。目前所有的 Spring Boot 2.x 版本都能很好地适配 Java 17,你可以无需等待,先着手JDK的升级调试,并尝试一些新的特性和API。
尽快升级到Spring Boot 2.7
前几日胖哥已经讲了Spring Boot 2.7基本已经是Spring Boot 2.x最后一个大版本了,Spring Boot 2.5已经停止OSS支持,不再进行维护,Spring Boot 2.6也将在Spring Boot 3.0发布后停止维护,迭代的速度越来越快了。尽早升级到2.7才能更好迁移到3.0,这里胖哥建议不要跳版本升级,比如不要直接从2.4跳到2.7,尽量按照2.4、2.5、2.6、2.7这样的步骤升级,跨度太大反而不利于平滑升级。
移除过时代码
每个Spring Boot版本都会或多或少有一些被标记为@Deprecated的代码,Spring Boot 3.0 将完全移除在 2.x 过时的代码,当然2.x早期的过时代码也可能在最新的2.x被移除。尽量不要使用过时代码,一般过时代码上都注释有过时的原因或者替代的API。
配置文件机制的更改
在Spring Boot 2.4中,配置文件 application.properties 和 application.yaml 的加载机制被改变,目的是为了简化外部配置的加载方式,使之更加合理,带来的是不向下兼容。为了平滑升级,Spring 提供了一个配置项来兼容旧机制:
spring:
config:
use-legacy-processing: true
而这个机制将在3.0时移除,我们必须使用符合新机制的配置方式,如果你存在这几种方式就需要注意了。
多文档Yaml
如果你在yaml配置文件中使用了间隔符---来声明多文档的话,你得知道现在按文档声明的顺序来注册声明的配置属性;而在 Spring Boot 2.3 及更早版本中,基于配置文件激活顺序。 举个例子:
---
spring:
profiles:
active: dev
application:
name: dev-app
server:
port: 8081
---
spring:
profiles:
active: prod
application:
name: prod-app
server:
port: 8080
这个配置文件在Spring Boot 2.3以及更早的版本中会根据spring.profiles.active来决定加载的环境。但是从2.4开始后面的属性会覆盖前面的属性。
外部配置总是覆盖jar内的配置
如果你的配置文件在jar之外,并且该配置文件适用于特定的环境,例如application-dev.yaml。2.4以下的版本中,在jar外面的application.yaml不会覆盖jar中的application-<profile名称>.yaml文件,从2.4开始外部文件将总是覆盖jar内的配置文件。你需要检查你是否存在这种情况。
激活配置文件
如果您使用spring.profiles属性来激活环境配置,那么现在就应该迁移到spring.config.activate.on-profile。
旧玩法:
spring:
profiles: "prod"
secret: "production-password"
新玩法:
spring:
config:
activate:
on-profile: "prod"
secret: "production-password"
这真是折腾人啊。spring.profiles.active仍然可以用来激活特定的环境,例如命令行
$ java -jar myapp.jar --spring.profiles.active=prod
你也可以在 application.properties 或 application.yaml 中使用spring.profiles.active,从2.4开始spring.profiles.active不能在特定环境中使用,也就是说application-<profile>.yaml中不能使用,---间隔的多文档中也不能使用它。一句话,你不能再通过spring.profiles.active来合并一个包含了spring.config.activate.on-profile属性的配置文件。
另外 spring.profiles.include属性,只能在非特定配置文件中使用,下面的配置是无效的:
# 无效配置
spring:
config:
activate:
on-profile: "prod"
profiles:
include: "metrics"
更多的要点请参考官方配置文件Spring boot配置迁移指南。
性能更高的路径解析方式
从Spring Boot 2.6 开始,路径解析默认使用PathPatternParser,取代了之前的Ant风格匹配AntPathMatcher,升级时很多人的Swagger出问题了,通过spring.mvc.pathmatch.matching-strategy解决了这个问题。虽然在Spring Boot 3.0中AntPathMatcher会继续生效,但是PathPatternParser成为官方推荐,因为它的性能更高,稍后我也将出一篇专题来分析PathPatternParser。
兼容问题
首先是Jakarta EE 9的兼容问题,确保你的第三方依赖库和你的代码都兼容Jakarta EE 9。另外也要检查Spring框架正在使用的第三方依赖jar是否有计划兼容Spring 6。
尝试去学习Spring 6
Spring 6以及Spring Boot 3已经发布了多个里程碑,在闲暇时间可以抽出一些时间去尝试一下,体验新的特性和变化,评估你应用升级的难度。
关注公众号:Felordcn 获取更多资讯
是时候为Spring Boot 3.0做准备了的更多相关文章
- springboot2.0(一):【重磅】Spring Boot 2.0权威发布
就在昨天Spring Boot2.0.0.RELEASE正式发布,今天早上在发布Spring Boot2.0的时候还出现一个小插曲,将Spring Boot2.0同步到Maven仓库的时候出现了错误, ...
- 业余草分享 Spring Boot 2.0 正式发布的新特性
就在昨天Spring Boot2.0.0.RELEASE正式发布,今天早上在发布Spring Boot2.0的时候还出现一个小插曲,将Spring Boot2.0同步到Maven仓库的时候出现了错误, ...
- spring boot 2.0.0由于版本不匹配导致的NoSuchMethodError问题解析
spring boot升级到2.0.0以后,项目突然报出 NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBu ...
- Spring Boot 2.0(六):使用 Docker 部署 Spring Boot 开源软件云收藏
云收藏项目已经开源2年多了,作为当初刚开始学习 Spring Boot 的练手项目,使用了很多当时很新的技术,现在看来其实很多新技术是没有必要使用的,但做为学习案例来讲确实是一个绝佳的 Spring ...
- Spring Boot 2.0系列文章(七):SpringApplication 深入探索
关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/30/springboot_SpringApplication/ 前言 在 Spring B ...
- Spring Boot 2.0 教程 - 深入SpringAplication
原文连接:https://www.codemore.top/cates/Backend/post/2018-05-20/spring-boot-SpringApplication 可以通过Spring ...
- Spring Boot 2.0 的快速入门(图文教程)
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! Spring Boot 2.0 的快速入门(图文教程) 大家都 ...
- Spring Boot 2.0 教程 | 配置 Undertow 容器
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 文章首发于个人网站 https://ww ...
- Spring Boot 2.0 教程 | AOP 切面统一打印请求日志
欢迎关注微信公众号: 小哈学Java 文章首发于个人网站 https://www.exception.site/springboot/spring-boot-aop-web-request 本节中,您 ...
随机推荐
- 【uniapp 开发】字典工具类 ObjectUtil
{__/} ( • - •) /つ寿司 你要不要? {__/} ( • - •) /つ草莓 你要不要? {__/} ( • - •) /つ披萨 你要不要? {__/} ( • - •) /つ桃子 你要 ...
- java中接口interface和private私有内部类怎样一块配合着用?
3.接口interface和private内部类协同工作[新手可忽略不影响继续学习]马克-to-win:由于是private内部类,外面无法访问甚至无法看到你编的源代码(如果在不同的包中),非常安全. ...
- 【每日日报】第三十八天---java与时间相关
1 今天看了网上的课程 学习了java的关于时间的代码 获取时间 import java.util.Date; public class DateDemo { public static void m ...
- 关于iOS 二维数组,对象映射的问题
数据格式如下: 遇到的问题是二维数组的 对象无法 通过 yymodel 直接实力话 ~~~ -"scoring_probability_distribution": [ -[ -{ ...
- python---使用pipreqs及遇到的问题
pipreqs简介 项目开发的过程中, 避免不了搭建和部署开发环境, 而搭建和部署开发环境需要项目依赖的python第三方包, 如何获取一个项目中所需依赖的python第三方包, 这就需要使用pi ...
- 创建可以运行宿主机GPU的容器
1.安装NVIDIA Container Runtime apt-get参考https://blog.csdn.net/li_ellin/article/details/107180516 yum参考 ...
- Java中的List接口实现类LinkedList
package collection; import java.util.LinkedList; /* * 1.implement List接口 * 2.底层是一个链表结构:查询慢,增删快 * 注意: ...
- spring-注入集合对象
1.创建Stu类 package com.spring.collections; import java.util.Arrays; import java.util.List; import java ...
- java四种访问修饰符及各自的权限
1.public,即共有的,是访问权限限制最宽的修饰符.被public修饰的类.属性.及方法不仅可以跨类访问,而且可以跨包访问. 2. protected,即保护访问权限,是介于public和priv ...
- [转载] go get 拉取第三方包过慢、卡住解决方案
修改go env,选用国内的代理地址下载.