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。第一時間瞭解前沿行業消息、分享深度技術乾貨、獲取優質學習資源