Spring Boot 3.0 is now available and includes more than 5,700 code commits from 151 developers over 12 months. This is the first major revision of Spring Boot since the release of 2.0 4.5 years ago.

It is also the first Spring Boot GA release to support Spring Framework 6.0 and GraalVM, and the first Java 17-based version of Spring Boot, benchmarked against Jakarta EE 9 and supporting Jakarta EE 10. It also supports AOT and Native Image with GraalVM.

If you want to try Spring Boot 3.0, you may want to refer to this upgrade guide.

Upgrading the JDK

First upgrade your JDK to JDK17, or if you want to use Native Image features, use GraalVM 22.3 or higher and Native Build Tools Plugin 0.9.17 or higher.

Smooth upgrade

It is not recommended to upgrade directly from a version lower than Spring Boot 2.7 to Spring Boot 3.0, otherwise too many new features and API changes will require you to change a lot of configurations and the upgrade path will be too steep. It is recommended to upgrade to 2.4, 2.6, 2.7 and finally to 3.0 in stages via minor version numbers.

Dependency evaluation

The version requirements for dependent components under Spring Boot 3.0 vary, for example, the Spring Boot Kafka Starter may have requirements for Kafka that require you to fully evaluate. the Spring Cloud system should be upgraded after the release of the corresponding Spring Boot 3.0 system.

Upgrading to Spring Boot 3

Once the above is ready, you can start trying to upgrade to Spring Boot 3.0.

Configuration Properties Compatibility

In Spring Boot 3.0, some configuration properties have been renamed/removed and developers need to update their application.properties or application.yml accordingly. To help you do this, Spring Boot 3.0 provides a spring-boot-properties-migrator module. Once added to your project as a dependency, it will not only analyze your application’s environment and print diagnostics at startup, but will also temporarily migrate properties for you at runtime. Add the following to pom.xml to help you upgrade your compatibility configuration properties.

1
2
3
4
5
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-properties-migrator</artifactId>
    <scope>runtime</scope>
</dependency>

After completing the migration, be sure to remove the spring-boot-properties-migrator dependency.

Jakarta EE

Since Java EE has been changed to Jakarta EE, the package names starting with javax need to be changed to jakarta accordingly. It is recommended to use the built-in function provided by Intellij IDEA 2021.2 to handle this in bulk.

Replace javax with jakarta in Intellij IDEA 2021.2

Of course you can also change the package name manually.

Key Changes for the Upgrade

Spring Boot 3.0 has some key changes that will be relevant to most applications. So developers should read these changes carefully.

Image Banners are no longer supported

Now Spring Boot 3.0 Custom Banner only supports text types (banner.txt) and no longer supports image types.

Log Date Format Change

The default format of the date and time portions of Logback and Log4j2 log messages has been changed to conform to the ISO-8601 standard. The new default format yyyy-MM-dd'T'HH:mm:ss.SSSXXX uses T to separate the date and time instead of the space character and adds a time zone offset at the end. The LOG_DATEFORMAT_PATTERN environment variable or the logging.pattern.dateformat property can be used to restore the previous default value of yyyyy-MM-dd HH:mm:ss.SSS.

ConstructingBinding annotations

The ConfigurationProperties class annotation @ConfigurationProperties is no longer required by default to mark constructions with @ConstructorBinding, and you should remove it from the configuration class unless the configuration class has multiple constructors to explicitly configure the property binding.

YamlJsonParser removed

because SnakeYAML’s JSON parsing is not consistent with other parser implementations. If you are using YamlJsonParser directly, please migrate to another JsonParser implementation.

Automatic Configuration File Changes

Spring Boot 2.7 introduced a new file.

1
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

This is used to register autoconfigurations while maintaining backward compatibility with registration in spring.factories, which has been removed with the release of Spring Boot 3.0 and can only be registered via the imports file.

Web Application Changes

Path Matching

The path matching rules for Spring MVC and Spring Webflux have now been adjusted so that by default the trailing slash / will have a different matching mechanism than before.

  • Before 3.0 /foo/bar is equivalent to /foo/bar/
  • After 3.0 /foo/bar different from /foo/bar/

deprecated configuration server.max-http-header-size

server.max-http-header-size has been deprecated and is now replaced by server.max-http-request-header-size and this property can now only be used to configure the size of request headers and no longer limits the response header size of certain web containers. Customize WebServerFactoryCustomizer to achieve this.

Updated Phases for Graceful Shutdown

Graceful shutdown is implemented by SmartLifecycle and starts at the SmartLifecycle.DEFAULT_PHASE - 2048 phase and the web server is stopped at the SmartLifecycle.DEFAULT_PHASE - 1024 phase. Any SmartLifecycle implementations that participate in graceful shutdown should be updated accordingly.

Jetty

Since Jetty does not currently support Servlet 6.0, developers using Jetty need to reduce the version of Jakarta Servlet to 5.0.

The spring.data prefix has been reserved for the Spring Data project and if you are using a subproject of the Spring Data project, the relevant configuration properties in application.yaml will need to be changed in response. For example spring.redis now needs to be changed to spring.data.redis.

Data access related components are now using a relatively new version of.

  • Flyway updated to 9.0
  • Hibernate updated to 6.1
  • R2DBC updated to 1.0

Mongodb

In addition, the automatic configuration of Flapdoodle embedded MongoDB has been removed and developers need to import it themselves if needed.

Elasticsearch

Elasticsearch’s Rest client uses a new API implementation, the old autoconfiguration and Spring Data Elasticsearch’s old client API has been removed.

Spring Security

Related changes will be made and shared later when they are organized.

Other Changes

Observability, metric tracking, Maven, and Gradle have also been changed to varying degrees, so check out the official Spring-Boot-3.0-Migration-Guide if you need to.

Reference: https://mp.weixin.qq.com/s?__biz=MzUzMzQ2MDIyMA==&mid=2247494392&idx=1&sn=076cacd465ca8f43ed25a3178f4efaa5