Spring Boot 2.x 到 3.2 的全面升级指南
Spring Framework 是一种流行的开源企业级框架,用于创建在 Java Virtual Machine (JVM) 上运行的独立、生产级应用程序。而Spring Boot 是一个工具,可以让使用 Spring 框架更快、更轻松地开发 Web 应用程序和微服务。随着 Spring Boot 的不断发展,开发人员必须跟上最新的升级和变化。
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 的版本,如下所示。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
</parent>
3. 配置属性迁移
在 Spring Boot 3.0 中,一些配置属性被重命名/删除,开发人员需要相应地更新其 application.properties/application.yml
。
为了帮助您实现这一点,Spring Boot 提供了一个 spring-boot-properties-migrator
模块。
我们可以通过将以下内容添加到 Maven pom.xml
来添加迁移器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<scope>runtime</scope>
</dependency>
4. 升级到 Jakarta EE
由于 Java EE 已更改为 Jakarta EE,Spring Boot 3.x 的所有依赖项 API 也从 Java EE 升级为 Jakarta EE。
简单来说,您需要将所有 javax
的 imports 都替换为 jakarta
。具体如下:
javax.persistence.* -> jakarta.persistence.*
javax.validation.* -> jakarta.validation.*
javax.servlet.* -> jakarta.servlet.*
javax.annotation.* -> jakarta.annotation.*
javax.transaction.* -> jakarta.transaction.*
5. 调整@ConstructorBinding
注解
@ConstructorBinding
在 @ConfigurationProperties
类的类型级别不再需要,应将其删除。
当一个类或记录有多个构造函数时,它仍然可以在构造函数上使用,以指示应使用哪一个构造函数进行属性绑定。
6. Spring MVC 和 WebFlux的URL匹配更改
从 Spring Framework 6.0 开始,尾部斜杠匹配配置选项已为 deprecated,其默认值设置为 false。
这意味着以前,以下控制器将匹配GET /health
和GET /health/
@RestController
public class HealthController {
@GetMapping("/health")
public String health() {
return "Application is Working";
}
}
@RestController
public class HealthController {
@GetMapping("/health")
public Mono<String> health() {
return Mono.just("Application is Working");
}
}
7. RestTemplate 中的 Apache HttpClient
Spring Framework 6.0 中已删除对 Apache HttpClient 的支持,现在由 org.apache.httpcomponents.client5:httpclient5
取代(注意:此依赖项具有不同的 groupId)。
如果您注意到 HTTP 客户端行为存在问题,则 RestTemplate
可能会回退到 JDK 客户端。
org.apache.httpcomponents:httpclient
可以由其他依赖项传递传递,因此您的应用程序可能依赖此依赖项而不声明它。
下面是迁移后的RestTemplate
示例:
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(){
final SSLConnectionSocketFactory sslConnectionSocketFactory = SSLConnectionSocketFactoryBuilder.create()
.build();
final PoolingHttpClientConnectionManager manager = PoolingHttpClientConnectionManagerBuilder.create()
.setSSLSocketFactory(sslConnectionSocketFactory)
.build();
final CloseableHttpClient closeableHttpClient = HttpClients.custom().setConnectionManager(manager)
.build();
final HttpComponentsClientHttpRequestFactory componentsClientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
componentsClientHttpRequestFactory.setHttpClient(closeableHttpClient);
final RestTemplate restTemplate = new RestTemplate(componentsClientHttpRequestFactory);
return restTemplate;
}
}
8. 升级 Spring Security
Spring Boot 3.0 已升级到 Spring Security 6.0。
因此,WebSecurityConfigurerAdapter
已被弃用。 Spring鼓励用户转向基于组件的安全配置。
为了演示新的配置风格,我们使用 Spring Security lambda DSL 和方法 HttpSecurity#authorizeHttpRequests
来定义我们的授权规则。
下面是使用 WebSecurityConfigurerAdapter
的示例配置,它通过 HTTP Basic 保护所有端点:
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authz) -> authz
.anyRequest().authenticated()
)
.httpBasic(withDefaults());
}
}
展望未来,推荐的方法是注册一个 SecurityFilterChain
bean:
@Configuration
public class SecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authz) -> authz
.anyRequest().authenticated()
)
.httpBasic(withDefaults());
return http.build();
}
}
9. Spring Kafka 模板升级
KafkaTemplate
方法现在返回 CompleteableFuture
而不是 ListenableFuture
,后者已被弃用。
Spring Boot 2.x 中带有 ListenableFuture
的 Kafka 模板:
private RoutingKafkaTemplate routingKafkaTemplate;
public void send(){
ListenableFuture<SendResult<Object,Object>> future = routingKafkaTemplate.send("Message","topic");
future.addCallback(new ListenableFutureCallback<>() {
@Override
public void onFailure(Throwable ex) {
log.error(ex);
}
@Override
public void onSuccess(SendResult<Object, Object> result) {
log.info("success");
}
});
}
Spring Boot 3.x 中带有 CompletableFuture
的 Kafka 模板:
private RoutingKafkaTemplate routingKafkaTemplate;
public void send() {
CompletableFuture<SendResult<Object, Object>> future = routingKafkaTemplate.send("Message", "topic");
future.thenAccept(log::info)
.exceptionally(exception -> {
log.error(exception);
return null;
});
}
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
. 文件中包含以下依赖项。
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.3.0</version>
</dependency>
WebFlux 项目的 Spring Doc OpenAPI 升级
对于 WebFlux 项目,您需要在 pom.xml
. 文件中包含以下依赖项。
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webflux-ui</artifactId>
<version>2.3.0</version>
</dependency>
今日分享就到这里,感谢阅读!如果您学习过程中如遇困难?可以加入我们超高质量的Spring技术交流群,参与交流与讨论,更好的学习与进步!更多Spring Boot教程可以点击直达!,欢迎收藏与转发支持!
欢迎关注我的公众号:程序猿DD。前沿技术早知道,弯道超车有希望!积累超车资本,从关注DD开始!
更多推荐
所有评论(0)