领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多Spring Framework 团队一直忙于积极审查问题跟踪器并减少已打开问题的数量。这早就应该做了,在此期间,许多问题已被证明无效或已被取代。这帮助团队专注于更易于管理的问题数量,我们借此机会查看了一些我们一直没有时间解决的长期存在的问题。
在这篇文章中,我想带您了解这些相对较小的问题的集合,有时投票数很高,这些问题终于在这个里程碑中得到了解决。
属性占位符是一种在任意字符串中替换来自环境的属性的方法。假设customer.name
在Environment
中设置为“John Smith”,“Customer ${customer.name}”将解析为“Customer John Smith”。
在某些情况下,您可能希望保留原始值,而不是将其解析。 一个问题是在 2008 年创建的,并且获得了相当多的投票。Spring Framework 6.2.0-M1
允许您使用可配置的转义字符(默认情况下为反斜杠)转义占位符。以我们之前的示例为例,“Customer \${customer.name}”现在解析为“Customer ${customer.name}”。
这看起来像是一个无伤大雅的更改,为什么我们花了这么长时间才修复它?!事实证明,我们不得不从头开始重写解析器,这还有其他积极的副作用:默认值现在是延迟解析的,并且在解析嵌套占位符时,异常消息提供了解析链。
这个 投票数很高的 issue 也已得到解决,并在构建可能需要回退 Bean 的配置时为您提供更多控制。如果未提供该类型的 Bean,则使用回退 Bean。这本质上是@Primary
的补充,无需指定它。
假设一个组件需要定义MyService
。您可以为服务提供一个默认实现,但您希望如果用户指定了一个,它可以按类型透明地注入。到目前为止,用户必须使用@Primary
配置其特定的 Bean 以确保使用它,因为现在定义了两种类型的 Bean。
从 Spring Framework 6.2.0-M1
开始,您可以使用@Fallback
构建您的配置
@Configuration
class MyConfiguration {
@Bean
MyComponent myComponent(MyService service) {
...
}
@Bean
@Fallback
MyService defaultMyService() {
...
}
}
正如您所料,如果没有定义其他MyService
Bean,则使用defaultMyService
。否则,容器将透明地选择在外部定义的那个。
有史以来投票数最多的 issue 之一 也在这个里程碑中得到解决。可以使用新引入的bootstrap
属性在后台初始化单个 Bean。
@Configuration
class MyConfiguration {
@Bean(bootstrap = BACKGROUND)
MyExpensiveComponent myComponent() {
...
}
}
查看 参考指南,了解有关此新功能的更多详细信息。
Spring Framework 6.2.0-M1
也允许对计划任务使用TaskDecorator
,从而协调任务执行和调度过程。请参阅 相关 issue 以获取更多详细信息。
我们喜欢 AssertJ!虽然 Spring Boot 一段时间前就已经采用了该技术并提供了使用它的几个测试工具,但框架团队一直更加保守。同时, 我们认识到我们的 Hamcrest 支持可能无法满足每个人的需求:静态导入的使用使 API 难以发现,并且编写自定义断言更加困难。
Spring Framework 6.2.0-M1
提供了对使用 MockMvc 和 AssertJ 测试 Web 应用程序的全面支持。
构建AssertableMockMvc
实例更加简单,类本身提供了专用的工厂方法。如果您有一个WebApplicationContext
,这就像AssertableMockMvc.from(webApplicationContext)
一样简单。如果您只想在单元测试中测试一个控制器,您可以按如下方式执行:
AssertableMockMvc mvc = AssertableMockMvc.of(List.of(new HelloController()), builder ->
builder.defaultRequest(get("/hello").accept(MediaType.APPLICATION_JSON)).build());
获得实例后,您可以执行通常的请求,并将其包装在 AssertJ 的标准assertThat
中
assertThat(mvc.perform(get("/vehicle/{id}", "12").accept(MediaType.TEXT_PLAIN))).hasStatusOk()
.body().isEqualTo("Honda Civic");
第一个里程碑涵盖了与现有 Hamcrest 匹配器相同的功能,并通过高级 JSON 支持对其进行了扩展,例如
assertThat(perform(get("/message"))).body().json()
.isLenientlyEqualTo(new ClassPathResource("samples/message.json"));
这是 API 的第一个版本,我们期待社区反馈以改进它。
Spring Framework 6.2.0-M1
解决了超过 一百个 issue,包含了大量增强功能,敬请期待我们未来几周发布的更多信息。
在构建针对它的 Spring Boot 3.4 快照之前,您需要将spring-framework.version
覆盖到里程碑版本。请尝试一下,并让我们知道结果如何。
编码愉快!