我试用了Spring Boot 3.0

這是「NSSOL 2022年過聖誕節的日曆」的第三天。因為事情突然要寫,所以我希望到12月底逐漸讓文章進一步發展起來。(藉口)

序言

2022年11月24日,备受期待的Spring Boot 3.0版本终于发布了。考虑到Spring Boot 2.0的发布日期是2018年3月1日,这次更新算是五年不到的重大版本升级。虽然其他网站已经介绍了该版本,但本次我们将根据官方网站和GitHub的说明进行各种尝试。

相较于Spring Boot 2,有什么变化。

我試著用星星來簡單表示重要性。(這是我的個人評價)

    • 【★★★】Java 17 Baseline and Java 19 Support

 

    • 【★★★】Third-party Library Upgrades

 

    • 【★★】GraalVM Native Image Support

 

    • 【★★】Log4j2 Enhancements

 

    • 【★】Improved @ConstructorBinding Detection

 

    • 【★】Micrometer Updates

 

    • 【★★】Prometheus Support

 

    • 【★】More Flexible Auto-configuration for Spring Data JDBC

 

    • 【★】Enabling Async Acks with Apache Kafka

 

    • 【★★】Elasticsearch Java Client

 

    • 【★】Auto-configuration of JdkClientHttpConnector

 

    【★】@SpringBootTest with Main Methods

从Java 17开始可用的环境确实具有最大的影响力。
由于Spring Boot 2系支持Java 16,所以如果选择采用Java 17,则必然选择Spring Boot 3.0以上。

此外,据说GraalVM Native Image的支持能够实现内存节省和缩短启动时间。它的引入非常简单,您可以使用buildpack进行构建,或者在使用Maven/Gradle等构建工具时添加以下命令。如果您想了解更多信息,请参考官方网站上这个页面。

# Maven
mvn -Pnative native:compile

# Gradle
gradle nativeCompile

从Spring Boot 2.x版本进行升级

请参考公式的GitHub页面以获取详细信息,以下是主要要点的概述:
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide

预先准备

    • Spring Boot 2.7系の最新にアップグレード

 

    • 依存関係の確認

 

    • Spring boot公式以外から提供されているライブラリは特に注意。

 

    • Spring Securityのアップグレード

 

    • Spring Security 5.8にアップグレードしてからSpring Security6.0にアップグレードするのが推奨

 

    • Javaランタイムの確認

 

    • Java 8はサポート対象外になっています。Java 17以上にアップグレードしましょう。

 

    非推奨クラス・メソッドの確認

升级工作 jí zuò)

    • spring-boot-properties-migratorをMaven/Gradleの依存関係に追加

 

    • application.properties/application.ymlに定義されているプロパティの名称が更新されます。

 

    アップグレードが完了したら、依存関係から除くことを忘れないように。
# Maven
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-properties-migrator</artifactId>
	<scope>runtime</scope>
</dependency>

# Gradle
runtime("org.springframework.boot:spring-boot-properties-migrator")

影響を受けるソースコードを修正します。変更が多岐にわたるので、手作業で修正していく場合は注意が必要です。

【★★★】Spring Framework 6.0
【★★★】Jakarta EE
【★★★】Core Changes
【★★★】Web Application Changes
【★★】Actuator Changes
【★★】Micrometer and Metrics Changes
【★★★】Data Access Changes
【★★★】Spring Security Changes
【★★】Spring Batch Changes
【★★】Spring Session Changes
【★★】Gradle Changes
【★★】Maven Changes
【★】Dependency Management Changes

もしマイグレーション対象が多くある等、極力手作業は排除したい場合は、以下のサイトで紹介されているようにOpenRewriteを利用する方法や、それを拡張したSpring Boot Migrator(SBM)もあるようです。もし試された方がいれば感想を教えてほしいです。
https://zenn.dev/cypher256/articles/b6e27b0556d012
https://github.com/spring-projects-experimental/spring-boot-migrator

似乎在Web应用程序中,GetMapping/PostMapping/RequestMapping指定的URL模式匹配的默认行为有些变化。

以往,即使不写最后的斜杠,也可以实现似乎有斜杠存在的行为。从现在起,需要明确地更改设置或按以下方式进行实施1。

@RestController
public class MyController {

  // 以下のように記載する
  @GetMapping({"/some/greeting","/some/greeting/"})
  public String greeting {
    return "Hello";
  }
}

另外,由于要使用Jakarta EE 9/10,因此需要修改软件包名称。这些案例非常易于理解。
https://developer.mamezou-tech.com/blogs/2022/09/25/ready-to-ee10/

关于迁移至Spring Security 6.0的指南,请点击此处。从初步查看,似乎没有太大的影响。但需要特别注意的是认证(Authentication)部分。

oauth2Login()方法的默认权限:
在Spring Security 5中,对于使用OAuth2或OpenID Connect 1.0提供商进行认证的用户(通过oauth2Login()方法),默认赋予的权限是ROLE_USER。
在Spring Security 6中,对于使用OAuth2提供商进行认证的用户,默认赋予的权限是OAUTH2_USER。对于使用OpenID Connect 1.0提供商进行认证的用户,默认赋予的权限是OIDC_USER。如果您仅为了升级到6.0而配置了GrantedAuthoritiesMapper,您可以完全删除它。

据说,用中文意思表示就是,在Spring Security 5中,默认的GrantedAuthority权限是ROLE_USER。而在Spring Security 6中,对于OAuth2的情况下是OAUTH2_USER,对于OIDC 1.0的情况下是OIDC_USER。

我尝试使用Spring Initializr创建一个样例应用程序。

首先,我们来试着制作一个简单的Web应用程序。
访问Spring Initializr,并指定依赖库,然后尝试生成代码。

image.png

目前看来,Okta、VMWare Tanzu和GCP的库似乎还不支持Spring Boot 3.0,因此请注意。

我将使用您喜欢的集成开发环境(IDE)导入并显示我们创建的项目。我会尝试打开我一直使用的 Pleiades All in One。由于需要下载新的依赖库,第一次可能需要大约10分钟的时间。请耐心等待。

在初始状态下,将会形成以下的形式。我们将参考Spring Initializr快速启动并添加代码进行执行。

image.png

我已经添加了一个只返回”hello world”的方法。

image.png

当你运行Spring Boot时,从日志中可以看到Spring Boot 3已经启动。

image.png

由于添加了spring-boot-starter-security作为依赖关系,将显示登录界面。用户ID为”user”,密码将添加在控制台输出的字符串中。

image.png

你好世界!显示了”Hello World!”。

image.png

根据这个描述,我想尝试一些更具Spring Boot 3特色的示例,因为到目前为止它与Spring Boot 2系列几乎没有太大区别。

请提供以下内容的中文翻译:参考

    • https://spring.io/blog/2022/11/24/spring-boot-3-0-goes-ga

 

    • https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes

 

    • https://www.infoq.com/jp/articles/native-java-graalvm/

 

    https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide
如果想让两种方法都匹配的话,由于修改设置的方式已被不推荐,应该同时记录两种方式。↩我也相当喜欢Visual Studio Code。↩

这也是因为不必要地添加了依赖库。↩

广告
将在 10 秒后关闭
bannerAds