javascript
Spring Boot 2.x 到 3.2 的全面升级指南
Spring Framework 是一種流行的開(kāi)源企業(yè)級(jí)框架,用于創(chuàng)建在 Java Virtual Machine (JVM) 上運(yùn)行的獨(dú)立、生產(chǎn)級(jí)應(yīng)用程序。而Spring Boot 是一個(gè)工具,可以讓使用 Spring 框架更快、更輕松地開(kāi)發(fā) Web 應(yīng)用程序和微服務(wù)。隨著 Spring Boot 的不斷發(fā)展,開(kāi)發(fā)人員必須跟上最新的升級(jí)和變化。
最近,Spring Boot 宣布發(fā)布 3.2.x 版本,該版本帶來(lái)了多項(xiàng)新功能、錯(cuò)誤修復(fù)和增強(qiáng)功能,鑒于對(duì) Spring Boot 2.7.x 版本的支持已于 2023 年 11 月 18 日結(jié)束,這是一個(gè)非常重要且強(qiáng)制性的關(guān)注用于將 Spring Boot 應(yīng)用程序升級(jí)到最新的 3.x 版本。
因此,在本文中,我們將討論如何從 Spring Boot 2.x 遷移到 3.x,以及升級(jí)的優(yōu)勢(shì)以及開(kāi)發(fā)人員在此過(guò)程中可能遇到的潛在困難。
升級(jí)指南
1. 升級(jí) JDK 17
Spring Boot 3.0 需要 Java 17 作為最低版本。
如果您當(dāng)前使用的是 Java 8 或 Java 11,則需要在 Spring Boot 遷移之前升級(jí) JDK。
2. 升級(jí)到 Spring Boot 3
查看項(xiàng)目及其依賴項(xiàng)的狀態(tài)后,請(qǐng)升級(jí)到 Spring Boot 3.0 的最新維護(hù)版本。
我們將使用 Spring Boot 3.2.0 進(jìn)行升級(jí)。
打開(kāi)項(xiàng)目的 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 中,一些配置屬性被重命名/刪除,開(kāi)發(fā)人員需要相應(yīng)地更新其 application.properties/application.yml。
為了幫助您實(shí)現(xiàn)這一點(diǎn),Spring Boot 提供了一個(gè) spring-boot-properties-migrator 模塊。
我們可以通過(guò)將以下內(nèi)容添加到 Maven pom.xml 來(lái)添加遷移器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<scope>runtime</scope>
</dependency>
4. 升級(jí)到 Jakarta EE
由于 Java EE 已更改為 Jakarta EE,Spring Boot 3.x 的所有依賴項(xiàng) API 也從 Java EE 升級(jí)為 Jakarta EE。
簡(jiǎn)單來(lái)說(shuō),您需要將所有 javax 的 imports 都替換為 jakarta。具體如下:
javax.persistence.* -> jakarta.persistence.*
javax.validation.* -> jakarta.validation.*
javax.servlet.* -> jakarta.servlet.*
javax.annotation.* -> jakarta.annotation.*
javax.transaction.* -> jakarta.transaction.*
5. 調(diào)整@ConstructorBinding注解
@ConstructorBinding 在 @ConfigurationProperties 類的類型級(jí)別不再需要,應(yīng)將其刪除。
當(dāng)一個(gè)類或記錄有多個(gè)構(gòu)造函數(shù)時(shí),它仍然可以在構(gòu)造函數(shù)上使用,以指示應(yīng)使用哪一個(gè)構(gòu)造函數(shù)進(jìn)行屬性綁定。
6. Spring MVC 和 WebFlux的URL匹配更改
從 Spring Framework 6.0 開(kāi)始,尾部斜杠匹配配置選項(xiàng)已為 deprecated,其默認(rèn)值設(shè)置為 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 中已刪除對(duì) Apache HttpClient 的支持,現(xiàn)在由 org.apache.httpcomponents.client5:httpclient5 取代(注意:此依賴項(xiàng)具有不同的 groupId)。
如果您注意到 HTTP 客戶端行為存在問(wèn)題,則 RestTemplate 可能會(huì)回退到 JDK 客戶端。
org.apache.httpcomponents:httpclient 可以由其他依賴項(xiàng)傳遞傳遞,因此您的應(yīng)用程序可能依賴此依賴項(xiàng)而不聲明它。
下面是遷移后的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. 升級(jí) Spring Security
Spring Boot 3.0 已升級(jí)到 Spring Security 6.0。
因此,WebSecurityConfigurerAdapter 已被棄用。 Spring鼓勵(lì)用戶轉(zhuǎn)向基于組件的安全配置。
為了演示新的配置風(fēng)格,我們使用 Spring Security lambda DSL 和方法 HttpSecurity#authorizeHttpRequests 來(lái)定義我們的授權(quán)規(guī)則。
下面是使用 WebSecurityConfigurerAdapter 的示例配置,它通過(guò) HTTP Basic 保護(hù)所有端點(diǎn):
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authz) -> authz
.anyRequest().authenticated()
)
.httpBasic(withDefaults());
}
}
展望未來(lái),推薦的方法是注冊(cè)一個(gè) 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 模板升級(jí)
KafkaTemplate 方法現(xiàn)在返回 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 升級(jí)
springdoc-openapi用于為Spring Boot 項(xiàng)目自動(dòng)生成 API 文檔。
springdoc-openapi的工作原理是在運(yùn)行時(shí)檢查應(yīng)用程序,以根據(jù) spring 配置、類結(jié)構(gòu)和各種注釋推斷 API 語(yǔ)義。
對(duì)于 spring-boot 3 支持,請(qǐng)確保使用 springdoc-openapi v2。
WebMVC 項(xiàng)目的 Spring Doc OpenAPI 升級(jí)
對(duì)于 WebMVC 項(xiàng)目,您需要在 pom.xml. 文件中包含以下依賴項(xiàng)。
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.3.0</version>
</dependency>
WebFlux 項(xiàng)目的 Spring Doc OpenAPI 升級(jí)
對(duì)于 WebFlux 項(xiàng)目,您需要在 pom.xml. 文件中包含以下依賴項(xiàng)。
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webflux-ui</artifactId>
<version>2.3.0</version>
</dependency>
今日分享就到這里,感謝閱讀!如果您學(xué)習(xí)過(guò)程中如遇困難?可以加入我們超高質(zhì)量的Spring技術(shù)交流群,參與交流與討論,更好的學(xué)習(xí)與進(jìn)步!更多Spring Boot教程可以點(diǎn)擊直達(dá)!,歡迎收藏與轉(zhuǎn)發(fā)支持!
歡迎關(guān)注我的公眾號(hào):程序猿DD。第一時(shí)間了解前沿行業(yè)消息、分享深度技術(shù)干貨、獲取優(yōu)質(zhì)學(xué)習(xí)資源
總結(jié)
以上是生活随笔為你收集整理的Spring Boot 2.x 到 3.2 的全面升级指南的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 免费背景音人声分离解决方案MVSEP-M
- 下一篇: 怪谈研究所复仇关卡怎么过 怪谈研究所复仇