经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring Boot » 查看文章
Spring Boot 2.x 到 3.2 的全面升级指南
来源:cnblogs  作者:程序猿DD  时间:2023/12/29 9:16:19  对本文有异议

Spring Framework 是一种流行的开源企业级框架,用于创建在 Java Virtual Machine (JVM) 上运行的独立、生产级应用程序。而Spring Boot 是一个工具,可以让使用 Spring 框架更快、更轻松地开发 Web 应用程序和微服务。随着 Spring Boot 的不断发展,开发人员必须跟上最新的升级和变化。

最近,Spring Boot 宣布发布 3.2.x 版本,该版本带来了多项新功能、错误修复和增强功能,鉴于对 Spring Boot 2.7.x 版本的支持已于 2023 年 11 月 18 日结束,这是一个非常重要且强制性的关注用于将 Spring Boot 应用程序升级到最新的 3.x 版本。

因此,在本文中,我们将讨论如何从 Spring Boot 2.x 迁移到 3.x,以及升级的优势以及开发人员在此过程中可能遇到的潜在困难。

升级指南

1. 升级 JDK 17

Spring Boot 3.0 需要 Java 17 作为最低版本。

如果您当前使用的是 Java 8 或 Java 11,则需要在 Spring Boot 迁移之前升级 JDK。

2. 升级到 Spring Boot 3

查看项目及其依赖项的状态后,请升级到 Spring Boot 3.0 的最新维护版本。

我们将使用 Spring Boot 3.2.0 进行升级。

打开项目的 pom.xml 并更新 Spring Boot 的版本,如下所示。

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>3.2.0</version>
  5. </parent>

3. 配置属性迁移

在 Spring Boot 3.0 中,一些配置属性被重命名/删除,开发人员需要相应地更新其 application.properties/application.yml

为了帮助您实现这一点,Spring Boot 提供了一个 spring-boot-properties-migrator 模块。

我们可以通过将以下内容添加到 Maven pom.xml 来添加迁移器:

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

4. 升级到 Jakarta EE

由于 Java EE 已更改为 Jakarta EE,Spring Boot 3.x 的所有依赖项 API 也从 Java EE 升级为 Jakarta EE。

简单来说,您需要将所有 javax 的 imports 都替换为 jakarta。具体如下:

  1. javax.persistence.* -> jakarta.persistence.*
  2. javax.validation.* -> jakarta.validation.*
  3. javax.servlet.* -> jakarta.servlet.*
  4. javax.annotation.* -> jakarta.annotation.*
  5. javax.transaction.* -> jakarta.transaction.*

5. 调整@ConstructorBinding注解

@ConstructorBinding@ConfigurationProperties 类的类型级别不再需要,应将其删除。

当一个类或记录有多个构造函数时,它仍然可以在构造函数上使用,以指示应使用哪一个构造函数进行属性绑定。

6. Spring MVC 和 WebFlux的URL匹配更改

从 Spring Framework 6.0 开始,尾部斜杠匹配配置选项已为 deprecated,其默认值设置为 false。

这意味着以前,以下控制器将匹配GET /healthGET /health/

  1. @RestController
  2. public class HealthController {
  3. @GetMapping("/health")
  4. public String health() {
  5. return "Application is Working";
  6. }
  7. }
  8. @RestController
  9. public class HealthController {
  10. @GetMapping("/health")
  11. public Mono<String> health() {
  12. return Mono.just("Application is Working");
  13. }
  14. }

7. RestTemplate 中的 Apache HttpClient

Spring Framework 6.0 中已删除对 Apache HttpClient 的支持,现在由 org.apache.httpcomponents.client5:httpclient5 取代(注意:此依赖项具有不同的 groupId)。

如果您注意到 HTTP 客户端行为存在问题,则 RestTemplate 可能会回退到 JDK 客户端。

org.apache.httpcomponents:httpclient 可以由其他依赖项传递传递,因此您的应用程序可能依赖此依赖项而不声明它。

下面是迁移后的RestTemplate示例:

  1. @Configuration
  2. public class RestTemplateConfig {
  3. @Bean
  4. public RestTemplate restTemplate(){
  5. final SSLConnectionSocketFactory sslConnectionSocketFactory = SSLConnectionSocketFactoryBuilder.create()
  6. .build();
  7. final PoolingHttpClientConnectionManager manager = PoolingHttpClientConnectionManagerBuilder.create()
  8. .setSSLSocketFactory(sslConnectionSocketFactory)
  9. .build();
  10. final CloseableHttpClient closeableHttpClient = HttpClients.custom().setConnectionManager(manager)
  11. .build();
  12. final HttpComponentsClientHttpRequestFactory componentsClientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
  13. componentsClientHttpRequestFactory.setHttpClient(closeableHttpClient);
  14. final RestTemplate restTemplate = new RestTemplate(componentsClientHttpRequestFactory);
  15. return restTemplate;
  16. }
  17. }

8. 升级 Spring Security

Spring Boot 3.0 已升级到 Spring Security 6.0。

因此,WebSecurityConfigurerAdapter 已被弃用。 Spring鼓励用户转向基于组件的安全配置。

为了演示新的配置风格,我们使用 Spring Security lambda DSL 和方法 HttpSecurity#authorizeHttpRequests 来定义我们的授权规则。

下面是使用 WebSecurityConfigurerAdapter 的示例配置,它通过 HTTP Basic 保护所有端点:

  1. @Configuration
  2. public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
  3. @Override
  4. protected void configure(HttpSecurity http) throws Exception {
  5. http
  6. .authorizeHttpRequests((authz) -> authz
  7. .anyRequest().authenticated()
  8. )
  9. .httpBasic(withDefaults());
  10. }
  11. }

展望未来,推荐的方法是注册一个 SecurityFilterChain bean:

  1. @Configuration
  2. public class SecurityConfiguration {
  3. @Bean
  4. public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
  5. http
  6. .authorizeHttpRequests((authz) -> authz
  7. .anyRequest().authenticated()
  8. )
  9. .httpBasic(withDefaults());
  10. return http.build();
  11. }
  12. }

9. Spring Kafka 模板升级

KafkaTemplate 方法现在返回 CompleteableFuture 而不是 ListenableFuture,后者已被弃用。

Spring Boot 2.x 中带有 ListenableFuture 的 Kafka 模板:

  1. private RoutingKafkaTemplate routingKafkaTemplate;
  2. public void send(){
  3. ListenableFuture<SendResult<Object,Object>> future = routingKafkaTemplate.send("Message","topic");
  4. future.addCallback(new ListenableFutureCallback<>() {
  5. @Override
  6. public void onFailure(Throwable ex) {
  7. log.error(ex);
  8. }
  9. @Override
  10. public void onSuccess(SendResult<Object, Object> result) {
  11. log.info("success");
  12. }
  13. });
  14. }

Spring Boot 3.x 中带有 CompletableFuture 的 Kafka 模板:

  1. private RoutingKafkaTemplate routingKafkaTemplate;
  2. public void send() {
  3. CompletableFuture<SendResult<Object, Object>> future = routingKafkaTemplate.send("Message", "topic");
  4. future.thenAccept(log::info)
  5. .exceptionally(exception -> {
  6. log.error(exception);
  7. return null;
  8. });
  9. }

10. Spring Doc OpenAPI 升级

springdoc-openapi用于为Spring Boot 项目自动生成 API 文档。

springdoc-openapi的工作原理是在运行时检查应用程序,以根据 spring 配置、类结构和各种注释推断 API 语义。

对于 spring-boot 3 支持,请确保使用 springdoc-openapi v2。

WebMVC 项目的 Spring Doc OpenAPI 升级

对于 WebMVC 项目,您需要在 pom.xml. 文件中包含以下依赖项。

  1. <dependency>
  2. <groupId>org.springdoc</groupId>
  3. <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
  4. <version>2.3.0</version>
  5. </dependency>

WebFlux 项目的 Spring Doc OpenAPI 升级

对于 WebFlux 项目,您需要在 pom.xml. 文件中包含以下依赖项。

  1. <dependency>
  2. <groupId>org.springdoc</groupId>
  3. <artifactId>springdoc-openapi-starter-webflux-ui</artifactId>
  4. <version>2.3.0</version>
  5. </dependency>

今日分享就到这里,感谢阅读!如果您学习过程中如遇困难?可以加入我们超高质量的Spring技术交流群,参与交流与讨论,更好的学习与进步!更多Spring Boot教程可以点击直达!,欢迎收藏与转发支持!

欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

原文链接:https://www.cnblogs.com/didispace/p/17934021.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号