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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…