领先一步
VMware 提供培训和认证,助您加速进步。
了解更多Spring Framework 团队一直在积极审查问题跟踪器,并减少已打开问题的数量。这早就该做了,因为许多问题已无效或已被取代。这有助于团队专注于更易于管理的问题数量,我们借此机会关注我们一直没有时间解决的长期存在的问题。
在本文中,我想带您了解这些相对较小的问题,有时是高度投票的问题,它们终于在这个里程碑版本中可用了。
属性占位符是一种在任意字符串中替换来自环境的属性的方式。假设在Environment中将customer.name设置为“John Smith”,那么“Customer ${customer.name}”将解析为“Customer John Smith”。
在某些边缘情况下,您可能希望保留原始值而不是解析它。2008年创建了一个issue,获得了相当多的投票。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。否则,容器将透明地选择已在外部定义的 Bean。
有史以来投票最多的 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 的第一个版本,我们期待社区的反馈来改进它。
随着超过一百个 issue 的解决,Spring Framework 6.2.0-M1充满了增强功能,预计我们将在未来几周内发布更多信息。
在有基于它构建的 Spring Boot 3.4 快照之前,您必须覆盖spring-framework.version到该里程碑版本。请尝试一下,并告知我们进展如何。
祝您编码愉快!