SpringBoot4與Spring7發布:云原生深度進化

Spring Boot 4和Spring Framework 7帶來基礎要求升級、模塊化改進、API版本化、聲明式HTTP客戶端、彈性注解等重大特性,標志著Java開發生態向云原生時代的深度進化。

近日,Spring生態迎來了自2022年以來最具里程碑意義的更新——Spring Boot 4和Spring Framework 7的正式發布。這兩個版本延續了Spring團隊的現代化征程,不僅采納了最新的Java語言特性,還與Jakarta EE 11實現了更緊密的整合,同時顯著提升了開發效率并為應用提供了更強的彈性支持。本文將深入解析這兩個版本的核心特性,幫助開發者全面把握這次升級帶來的變革。

基礎要求全面升級

Spring Boot 4和Spring Framework 7在基礎要求上有了顯著提升。雖然Java 17仍然是最低要求,但官方強烈推薦使用Java 21或Java 25以充分利用虛擬線程等新JVM特性。Spring Framework 7全面采用了Jakarta EE 11標準,這意味著開發者將使用Servlet 6.1、JPA 3.2和Bean Validation 3.1等最新規范。對于Kotlin開發者,新版本支持Kotlin 2.2及以上版本,提供了更流暢的協程集成和響應式代碼編寫體驗。

Spring Boot 4的重大改進

作為第四個主要版本,Spring Boot 4在性能、可觀察性、可維護性和配置支持方面都有顯著增強。

在本地鏡像方面,Spring Boot 4與GraalVM 24完全對齊,提前處理技術得到增強,這意味著更快的構建時間和更少的啟動內存占用。Spring Data引入了AOT存儲庫,將查詢方法轉換為與應用程序一起編譯的源代碼。

可觀察性方面,Spring Boot 4升級到Micrometer 2并集成了OpenTelemetry starter,使追蹤、日志和指標能夠無縫協作。SSL健康報告也得到了改進,證書鏈中即將過期的證書現在會在新的expiringChains條目中顯示,不再使用WILL_EXPIRE_SOON狀態,而是將即將過期的證書報告為VALID,這使得團隊在生產環境中監控SSL證書有效性變得更加容易。

模塊化是Spring Boot 4的另一個重要改進。新版本將自動配置和支持代碼拆分為更小、更專注的模塊,這意味著更快的構建和本地鏡像生成,更清晰的依賴管理,以及為Spring團隊和貢獻者提供了更好的可維護性。

對于使用starter依賴的開發者,不需要任何更改。例如,當需要JPA與Hibernate時,只需在pom.xml中添加以下依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

區別在于底層實現:JPA自動配置、Hibernate集成和驗證設置現在位于單獨的模塊中,這使得框架在運行時或AOT編譯期間處理配置時能夠更有選擇性。

新增的@ConfigurationPropertiesSource注解為更好的模塊化提供了支持。這個注解在構建時為spring-boot-configuration-processor提供提示,確保即使在跨模塊工作時也能生成完整的元數據。

Spring Framework 7的創新特性

Spring Framework 7帶來了許多期待已久的功能和精心設計的改進,涵蓋了測試、API設計和核心基礎設施等方面。

測試方面引入了測試上下文暫停功能。之前,長期運行的集成測試即使在空閑時也會消耗資源。現在,Spring可以暫停和恢復存儲在上下文緩存中的上下文,從而在大型測試套件中節省內存并加快測試執行速度。新的RestTestClient使得測試REST端點變得更加簡單,類似于WebTestClient,但不需要引入響應式基礎設施。

以下是一個使用RestTestClient的示例:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class HelloWorldApiIntegrationTest {
    RestTestClient client;
    
    @BeforeEach
    void setUp(WebApplicationContext context) {
        client = RestTestClient.bindToApplicationContext(context)
            .build();
    }
    
    @Test
    void shouldFetchHelloV1() {
        client.get()
            .uri("/api/v1/hello")
            .exchange()
            .expectStatus()
            .isOk()
            .expectHeader()
            .contentTypeCompatibleWith(MediaType.TEXT_PLAIN)
            .expectBody(String.class)
            .consumeWith(message -> assertThat(message.getResponseBody()).containsIgnoringCase("hello"));
    }
}

API版本化是其中一個最受期待的新功能。傳統上,開發者必須通過URL路徑約定、自定義頭或媒體類型來實現自己的解決方案。現在,框架提供了原生支持,開發者可以在控制器或方法級別指定版本屬性:

@RestController
@RequestMapping("/hello")
public class HelloWorldController {
    @GetMapping(version = "1", produces = MediaType.TEXT_PLAIN_VALUE)
    public String sayHelloV1() {
        return "Hello World";
    }
    
    @GetMapping(version = "2", produces = MediaType.TEXT_PLAIN_VALUE)
    public String sayHelloV2() {
        return "Hi World";
    }
}

也可以在控制器級別指定版本:

@RestController
@RequestMapping(path = "/hello", version = "3")
public class HelloWorldV3Controller {
    @GetMapping(produces = MediaType.TEXT_PLAIN_VALUE)
    public String sayHello() {
        return "Hey World";
    }
}

然后需要配置映射策略,可以是基于路徑的映射、基于查詢參數的映射、基于請求頭的映射或基于媒體類型頭的映射。以下配置使用基于路徑的映射:

@Configuration
public class ApiConfig implements WebMvcConfigurer {
    @Override
    public void configureApiVersioning(ApiVersionConfigurer configurer) {
        configurer.usePathSegment(1);
    }
    
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.addPathPrefix("/api/v{version}", HandlerTypePredicate.forAnnotation(RestController.class));
    }
}

聲明式HTTP客戶端支持是另一個值得注意的特性。受Feign啟發但更輕量且完全集成,新的@HttpServiceClient注解使得創建HTTP客戶端變得更加簡單:

@HttpServiceClient("christmasJoy")
public interface ChristmasJoyClient {
    @GetExchange("/greetings?random")
    String getRandomGreeting();
}

然后需要激活類路徑掃描并配置客戶端分配到的服務組:

@Configuration
@Import(HttpClientConfig.HelloWorldClientHttpServiceRegistrar.class)
public class HttpClientConfig {
    static class HelloWorldClientHttpServiceRegistrar extends AbstractClientHttpServiceRegistrar {
        @Override
        protected void registerHttpServices(GroupRegistry registry, AnnotationMetadata metadata) {
            findAndRegisterHttpServiceClients(registry, List.of("com.baeldung.spring.mvc"));
        }
    }
    
    @Bean
    RestClientHttpServiceGroupConfigurer christmasJoyServiceGroupConfigurer() String baseUrl) {
        return groups -> {
            groups.filterByName("christmasJoy")
                .forEachClient((group, clientBuilder) -> {
                    clientBuilder.baseUrl("https://christmasjoy.dev/api");
                });
        };
    }
}

ChristmasJoyClient然后可以像往常一樣注入到其他Spring組件中:

@RestController
@RequestMapping(path = "/hello", version = "4")
@RequiredArgsConstructor
public class HelloWorldV4Controller {
    private final ChristmasJoyClient christmasJoy;
    
    @GetMapping(produces = MediaType.TEXT_PLAIN_VALUE)
    public String sayHello() {
        return this.christmasJoy.getRandomGreeting();
    }
}

彈性注解現在內置在框架中。開發者可以用Spring注解來裝飾Spring組件方法,直接添加重試邏輯或并發限制:

@HttpServiceClient("christmasJoy")
public interface ChristmasJoyClient {
    @GetExchange("/greetings?random")
    @Retryable(maxAttempts = 3, delay = 100, multiplier = 2, maxDelay = 1000)
    @ConcurrencyLimit(3)
    String getRandomGreeting();
}

這些注解默認被忽略,除非在配置中添加@EnableResilientMethods。

多個TaskDecorator bean的支持消除了手動組合裝飾器的需要。例如,當有異步事件監聽器時:

@Component
@Slf4j
public class HelloWorldEventLogger {
    @Async
    @EventListener
    void logHelloWorldEvent(HelloWorldEvent event) {
        log.info("Hello World Event: {}", event.message());
    }
}

可以簡單注冊兩個TaskDecorator bean:

@Configuration
@Slf4j
public class TaskDecoratorConfiguration {
    @Bean
    @Order(2)
    TaskDecorator loggingTaskConfigurator() {
        return runnable -> () -> {
            log.info("Running Task: {}", runnable);
            try {
                runnable.run();
            } finally {
                log.info("Finished Task: {}", runnable);
            }
        };
    }
    
    @Bean
    @Order(1)
    TaskDecorator measuringTaskConfigurator() {
        return runnable -> () -> {
            final var ts1 = System.currentTimeMillis();
            try {
                runnable.run();
            } finally {
                final var ts2 = System.currentTimeMillis();
                log.info("Finished within {}ms (Task: {})", ts2 - ts1, runnable);
            }
        };
    }
}

空安全方面采用了JSpecify作為標準:

@Configuration
public class ApiConfig implements WebMvcConfigurer {
    @Override
    public void configureApiVersioning(@NonNull ApiVersionConfigurer configurer) {
        configurer.usePathSegment(1);
    }
}

棄用和移除的功能

隨著現代化進程,一些舊功能被清理:javax.*包被完全移除,只支持Jakarta EE 11;放棄了對Jackson 2.x的支持,Spring 7期望使用Jackson 3.x;移除了Spring JCL日志橋接,轉而采用Apache Commons Logging;棄用了JUnit 4支持,建議 exclusively 使用JUnit 5。如果仍然依賴這些較舊的API,遷移應該成為升級計劃的一部分。

這些更新使得應用程序更容易演進和強化,通過JSpecify空安全和Kotlin支持減少運行時錯誤,聲明式HTTP客戶端簡化了服務間調用,本地鏡像支持和可觀察性工具提高了云就緒程度。雖然重大升級總是需要投入測試工作,但在生產力、性能和可維護性方面的收益使得過渡是值得的。

https://www.jdon.com/81616-SpringBoot4-Spring7.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/923653.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/923653.shtml
英文地址,請注明出處:http://en.pswp.cn/news/923653.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于Spring Boot與Micrometer的系統參數監控指南

如何為你的Spring Boot應用裝上一個功能強大的監控儀表盤在現代微服務架構中&#xff0c;系統監控已成為保障應用穩定性的關鍵環節。通過有效的監控&#xff0c;我們可以實時了解應用的運行狀態&#xff0c;及時發現并解決性能問題。本文將介紹如何使用Micrometer及其注冊表&am…

【運維】-- 前端會話回放與產品分析平臺之 openreplay

目錄 OpenReplay 項目分析 1、項目概覽 2、關鍵特性 3、代碼結構&#xff08;Monorepo&#xff09; 4、技術棧與語言占比 5、部署與交付 6、社區與支持 7、版本與活躍度&#xff08;截至倉庫頁面所示&#xff09; 8、適用場景 9、優勢與注意事項 10、落地建議&#…

NineData社區版 V4.5.0 正式發布!運維中心新增細粒度任務權限管理,新增MySQL至Greenplum全鏈路復制對比

NineData 社區版 V4.5.0 正式發布&#xff01;在數據復制方面&#xff0c;新增 MySQL 至 Greenplum 全鏈路復制對比&#xff0c;并優化全局 DDL 管控、MySQL/PostgreSQL/MongoDB 同構性能。在數據庫 DevOps 方面&#xff0c;新增支持 AWS RDS 全系列及阿里云 PolarDB&#xff0…

discuz所有下載版本和升級工具

下載版本: Discuz! 每日構建版下載 - DiscuzX 3.x Daily Build Download Site SC是簡體中文 TC是繁體中文 可能你需要其他版本: Discuz!官方網站 - 開放、連接、共贏 下載簡體中文就好。 升級工具: 升級程序下載地址 https://gitee.com/oldhuhu/DiscuzX34235.git(…

【開題答辯全過程】以 “紅色棗莊”旅游網站為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

【LeetCode】2785. 將字符串中的元音字母排序

題目描述 題目鏈接 問題分析 這道體的思路非常簡單和好理解&#xff0c;找出字符串中的元音字符&#xff0c;然后按照ASSIC值進行排序&#xff0c;然后插入回對應的位置&#xff0c;解題步驟為&#xff1a; 使用一個set&#xff08;可以快速查找的容器&#xff09;&#x…

3 步發 10 億郵件,這個 GitHub 開源項目牛逼。

你是否要經常批量發郵件&#xff1f;無論是向客戶推送最新資訊、產品營銷&#xff0c;還是發送日常常規通知類郵件。使用第三方郵件服務平臺不僅成本高昂&#xff0c;功能限制多&#xff0c;而且可能無法保證隱私和安全。現在&#xff0c;有一個完全開源、能自己部署的解決方案…

【計算機網絡】DNS 解析 DNS 污染

1. DNS 解析&#xff08;工作流程、參與方與緩存&#xff09; DNS 的目標&#xff1a;把人類可讀的域名&#xff08;如 www.example.com&#xff09;映射為 IP 地址&#xff08;如 93.184.216.34&#xff09;。 典型解析流程&#xff08;遞歸解析器 迭代查詢&#xff09;&…

用住宿樓模型徹底理解Kubernetes架構(運行原理視角)

導讀&#xff1a;從樓宇建設到租客入住的全流程想象我們正在建設一棟巨型智能住宿樓&#xff0c;從基礎設施搭建到租客入住管理&#xff0c;每個環節都對應Kubernetes的組件和概念。本文將按運行原理的先后順序&#xff0c;系統解析Kubernetes的23個核心組件與基本概念。把 Kub…

嘉銀科技基于阿里云 Kafka Serverless 提升業務彈性能力,節省成本超過 20%

作者&#xff1a;四牛 前言 云消息隊列 Kafka 版 Serverless 系列憑借其秒級彈性擴展、按需付費、輕運維的優勢&#xff0c;助力嘉銀科技業務系統實現靈活擴縮容&#xff0c;在業務效率和成本優化上持續取得突破&#xff0c;保證服務的敏捷性和穩定性&#xff0c;并節省超過 20…

RTOS 任務狀態與調度機制詳解

一、任務狀態概述在實時操作系統&#xff08;RTOS&#xff09;中&#xff0c;任務通常具有以下幾種基本狀態&#xff1a;Running&#xff08;運行態&#xff09;&#xff1a;任務正在 CPU 上實際執行。單核系統中同一時刻最多只有一個任務處于運行態。Ready&#xff08;就緒態&…

TDengine 特殊選擇函數 UNIQUE 用戶手冊

UNIQUE 函數用戶手冊 函數定義 UNIQUE(expr)功能說明 UNIQUE() 函數返回指定列去重后的值&#xff0c;功能類似于 SQL 中的 DISTINCT 關鍵字。對于相同的數據值&#xff0c;UNIQUE 函數會返回時間戳最小的那一條記錄。該函數會跳過 NULL 值。 版本要求 最低版本: v3.0.0.0…

新零售第一階段傳統零售商的困境突破與二次增長路徑:基于定制開發開源AI智能名片S2B2C商城小程序的實踐探索

摘要&#xff1a;新零售第一階段&#xff0c;傳統零售商面臨同質化競爭、用戶消費意愿低迷、線上電商分流等核心困境。本文以定制開發開源AI智能名片S2B2C商城小程序為切入點&#xff0c;結合阿里巴巴、某知名連鎖零售企業等實踐案例&#xff0c;分析其通過“AI智能推薦供應鏈協…

Spark SQL 之 Join Reorder

參考鏈接 https://www.cnblogs.com/fxjwind/p/14768975.html join Reorder src/main/scala/org/apache/spark/sql/catalyst/optimizer/CostBasedJoinReorder.scala private def reorder(plan: LogicalPlan, output: Seq[Attribute]): LogicalPlan = {<

牛客周賽 Round 109

比賽鏈接&#xff1a;牛客競賽_ACM/NOI/CSP/CCPC/ICPC算法編程高難度練習賽_牛客競賽OJ A-小紅的直角三角形_牛客周賽 Round 109 簽到題&#xff1a;用勾股定理即可通過此題&#xff08;需要注意對共線情況的判斷&#xff09; 代碼&#xff1a; // Problem: 小紅的直角三角…

[deepseek]LNK2001錯誤即單獨編譯匯編并鏈接

方案一&#xff1a;使用預編譯的 .obj 文件&#xff08;最簡單&#xff09; 如果匯編代碼不常改動&#xff0c;這是最省事的方法。手動編譯一次&#xff1a; 打開命令行&#xff0c;切換到 spoof.asm 所在目錄。使用你已有的匯編器&#xff08;或者下載一個單獨的 MASM 版本&am…

php學習 (第六天)

虛擬主機 一.什么是虛擬主機&#xff1f; 1.1 概念虛擬主機&#xff08;Web Hosting&#xff09;英文&#xff1a;Web Hosting / Shared Hosting核心概念&#xff1a; 一臺服務器被切分給多個用戶&#xff0c;每個人只使用服務器的一部分資源&#xff08;CPU、內存、帶寬、存儲…

AcousticsML聲學機器學習翻譯教程二(特征提取Feature Etraction)

源自&#xff1a;https://github.com/RAMshades/AcousticsM 特征提取 特征是可測量的屬性&#xff0c;作為系統的輸入。這些輸入與特定數據樣本相關&#xff0c;機器學習模型可通過解讀這些特征來提供預測。特征通常具有獨立性&#xff0c;并能提供樣本的具體細節。音頻特征示例…

【論文閱讀】Beyond Text: Frozen Large Language Models in Visual Signal Comprehension

本論文研究了能否利用一個“凍結”的LLM&#xff0c;直接理解視覺信號&#xff08;即圖片&#xff09;&#xff0c;而不用在多模態數據集上進行微調。核心思想是把圖片看作一種“語言實體”&#xff0c;把圖片轉換成一組離散詞匯&#xff0c;這些詞匯來自LLM自己的詞表。為此&a…

The Oxford-IIIT寵物圖像識別數據集(753M)

0、引言博主研究生期間做的是人工智能領域相關的深度學習模型研究&#xff0c;早期還沒定題的時候調研了大量方向。眾所周知&#xff0c;模型性能的好壞很大程度上依賴于數據集&#xff0c;因此我當時也接觸了大量數據集&#xff0c;這陣子將這些數據集匯總整理了一下&#xff…