Spring Framework 是一種流行的開源企業(yè)級框架,用于創(chuàng)建在 Java Virtual Machine (JVM) 上運(yùn)行的獨(dú)立、生產(chǎn)級應(yīng)用程序。而Spring Boot 是一個工具,可以讓使用 Spring 框架更快、更輕松地開發(fā) Web 應(yīng)用程序和微服務(wù)。隨著 Spring Boot 的不斷發(fā)展,開發(fā)人員必須跟上最新的升級和變化。
最近,Spring Boot 宣布發(fā)布 3.2.x 版本,該版本帶來了多項(xiàng)新功能、錯誤修復(fù)和增強(qiáng)功能,鑒于對 Spring Boot 2.7.x 版本的支持已于 2023 年 11 月 18 日結(jié)束,這是一個非常重要且強(qiáng)制性的關(guān)注用于將 Spring Boot 應(yīng)用程序升級到最新的 3.x 版本。
因此,在本文中,我們將討論如何從 Spring Boot 2.x 遷移到 3.x,以及升級的優(yōu)勢以及開發(fā)人員在此過程中可能遇到的潛在困難。
升級指南
1. 升級 JDK 17
Spring Boot 3.0 需要 Java 17 作為最低版本。
如果您當(dāng)前使用的是 Java 8 或 Java 11,則需要在 Spring Boot 遷移之前升級 JDK。
2. 升級到 Spring Boot 3
查看項(xiàng)目及其依賴項(xiàng)的狀態(tài)后,請升級到 Spring Boot 3.0 的最新維護(hù)版本。
我們將使用 Spring Boot 3.2.0 進(jìn)行升級。
打開項(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 中,一些配置屬性被重命名/刪除,開發(fā)人員需要相應(yīng)地更新其 application.properties/application.yml
。
為了幫助您實(shí)現(xiàn)這一點(diǎn),Spring Boot 提供了一個 spring-boot-properties-migrator
模塊。
我們可以通過將以下內(nèi)容添加到 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 的所有依賴項(xiàng) 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. 調(diào)整@ConstructorBinding注解
@ConstructorBinding
在 @ConfigurationProperties
類的類型級別不再需要,應(yīng)將其刪除。
當(dāng)一個類或記錄有多個構(gòu)造函數(shù)時,它仍然可以在構(gòu)造函數(shù)上使用,以指示應(yīng)使用哪一個構(gòu)造函數(shù)進(jìn)行屬性綁定。
6. Spring MVC 和 WebFlux的URL匹配更改
從 Spring Framework 6.0 開始,尾部斜杠匹配配置選項(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 中已刪除對 Apache HttpClient 的支持,現(xiàn)在由 org.apache.httpcomponents.client5:httpclient5
取代(注意:此依賴項(xiàng)具有不同的 groupId)。
如果您注意到 HTTP 客戶端行為存在問題,則 RestTemplate
可能會回退到 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. 升級 Spring Security
Spring Boot 3.0 已升級到 Spring Security 6.0。
因此,WebSecurityConfigurerAdapter
已被棄用。 Spring鼓勵用戶轉(zhuǎn)向基于組件的安全配置。
為了演示新的配置風(fēng)格,我們使用 Spring Security lambda DSL 和方法 HttpSecurity#authorizeHttpRequests
來定義我們的授權(quán)規(guī)則。
下面是使用 WebSecurityConfigurerAdapter
的示例配置,它通過 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());
}
}
展望未來,推薦的方法是注冊一個 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
方法現(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 升級
springdoc-openapi
用于為Spring Boot 項(xiàng)目自動生成 API 文檔。
springdoc-openapi
的工作原理是在運(yùn)行時檢查應(yīng)用程序,以根據(jù) spring 配置、類結(jié)構(gòu)和各種注釋推斷 API 語義。
對于 spring-boot 3 支持,請確保使用 springdoc-openapi v2。
WebMVC 項(xiàng)目的 Spring Doc OpenAPI 升級
對于 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 升級
對于 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í)過程中如遇困難?可以加入我們超高質(zhì)量的Spring技術(shù)交流群,參與交流與討論,更好的學(xué)習(xí)與進(jìn)步!更多Spring Boot教程可以點(diǎn)擊直達(dá)!,歡迎收藏與轉(zhuǎn)發(fā)支持!文章來源:http://www.zghlxwxcb.cn/news/detail-761427.html
歡迎關(guān)注我的公眾號:程序猿DD。第一時間了解前沿行業(yè)消息、分享深度技術(shù)干貨、獲取優(yōu)質(zhì)學(xué)習(xí)資源文章來源地址http://www.zghlxwxcb.cn/news/detail-761427.html
到了這里,關(guān)于Spring Boot 2.x 到 3.2 的全面升級指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!