4. Spring Framework 4.1 中的新功能和增强功能

4.1 版包括许多改进,如以下各节所述:

4.1 JMS 改进

Spring 4.1 通过使用@JmsListenerCommentsbean 方法,引入了一个更简单的基础结构注册 JMS 侦听器端点。 XML 名称空间已得到增强,以支持此新样式(jms:annotation-driven),并且还可以使用 Java config(@EnableJmsJmsListenerContainerFactory)完全配置基础结构。也可以使用JmsListenerConfigurer以编程方式注册侦听器端点。

Spring 4.1 还调整了其对 JMS 的支持,使您可以从 4.0 中引入的spring-messaging抽象中受益,即:

  • 消息侦听器端点可以具有更灵活的签名,并可以从诸如@Payload@Header@Headers@SendTo之类的标准消息 Comments 中受益。也可以使用标准Message代替javax.jms.Message作为方法参数。

  • 一个新的JmsMessageOperations接口可用,并允许使用Message抽象进行JmsTemplate类似的操作。

最后,Spring 4.1 提供了其他一些其他改进:

  • JmsTemplate中支持同步请求-答复操作

  • 可以按<jms:listener/>元素指定侦听器优先级

  • 可以使用BackOff实现来配置消息侦听器容器的恢复选项

  • 支持 JMS 2.0 共享使用者

4.2 缓存改进

Spring 4.1 使用 Spring 现有的缓存配置和基础架构抽象来支持JCache(JSR-107)注解。使用标准 Comments 无需进行任何更改。

Spring 4.1 还大大改善了自己的缓存抽象:

  • 可以在运行时使用CacheResolver解析缓存。结果,定义要使用的缓存名称的value参数不再是必需的。

  • 更多操作级别的自定义项:缓存解析器,缓存 Management 器,密钥生成器

  • 新的@CacheConfig 类级 Comments允许在类级别共享通用设置,而无需启用任何缓存操作。

  • 使用CacheErrorHandler更好地处理缓存方法的异常

由于添加了新的putIfAbsent方法,Spring 4.1 的Cache界面也发生了重大变化。

4.3 Web 改进

  • 基于ResourceHttpRequestHandler的资源处理的现有支持已扩展为新的抽象ResourceResolverResourceTransformerResourceUrlProvider。许多内置实现提供对版本化资源 URL(用于有效的 HTTP 缓存),定位压缩后的资源,生成 HTML 5 AppCacheLists 等的支持。参见第 22.16.9 节“资源服务”

  • @RequestParam@RequestHeader@MatrixVariable控制器方法参数现在支持 JDK 1.8 的java.util.Optional

  • 支持ListenableFuture作为DeferredResult的返回值替代,其中基础服务(或对AsyncRestTemplate的调用)已经返回ListenableFuture

  • 现在按尊重相互依赖关系的 Sequences 调用@ModelAttribute方法。参见SPR-6299

  • @ResponseBodyResponseEntity控制器方法直接支持 Jackson 的@JsonView,用于序列化同一 POJO 的不同数量的细节(例如,摘要页面与细节页面)。通过将序列化视图类型添加为特殊键下的模型属性,基于视图的渲染也支持此功能。有关详情,请参见名为“ Jackson 序列化视图支持”的部分

  • Jackson 现在支持 JSONP。参见名为“ Jackson JSONP 支持”的部分

  • 在控制器方法返回之后和写入响应之前,可以使用新的生命周期选项来拦截@ResponseBodyResponseEntity方法。要利用这个优势,请声明一个实现ResponseBodyAdvice@ControllerAdvice bean。对@JsonView和 JSONP 的内置支持利用了这一点。参见第 22.4.1 节“使用 HandlerInterceptor 拦截请求”

  • 新增了三个HttpMessageConverter选项:

  • 格森(Gson)-比 Jackson(Jackson)足迹更轻;已在 Spring Android 中使用。

    • Google Protocol Buffers –高效,有效地用作企业内部的服务间通信数据协议,但也可以作为 JSON 和 XML 公开给浏览器。

    • 现在,通过jackson-dataformat-xml扩展支持基于 Jackson 的 XML 序列化。当使用@EnableWebMvc<mvc:annotation-driven/>时,如果jackson-dataformat-xml在 Classpath 中,则默认使用它而不是 JAXB2.

  • 现在,诸如 JSP 之类的视图可以通过按名称引用控制器 Map 来构建到控制器的链接。默认名称将分配给每个@RequestMapping。例如,使用方法handleFooFooController被命名为“ FC#handleFoo”。命名策略是可插入的。也可以通过其_name 属性显式命名@RequestMapping。 Spring JSP 标记库中的新mvcUrl函数使此功能易于在 JSP 页面中使用。参见第 22.7.3 节“从视图为控制器和方法构建 URI”

  • ResponseEntity提供了一个构建器样式的 API,可指导控制器方法准备服务器端响应,例如ResponseEntity.ok()

  • RequestEntity是一种新类型,它提供了一个生成器样式的 API,以指导 Client 端 REST 代码编写 HTTP 请求。

  • MVC Java 配置和 XML 名称空间:

  • 现在可以配置视图解析器,包括对内容协商的支持,请参阅第 22.16.8 节“视图解析器”

    • View Controller 现在具有对重定向和设置响应状态的内置支持。应用程序可以使用它来配置重定向 URL,使用视图呈现 404 响应,发送“无内容”响应等。一些用例是listed here

    • 路径匹配自定义是常用的,现在已内置。参见第 22.16.11 节,“路径匹配”

  • Groovy 标记模板支持(基于 Groovy 2.3)。请参见GroovyMarkupConfigurer并指定ViewResolver和`View'实现。

4.4 WebSocket 消息传递的改进

  • SockJS(Java)Client 端支持。参见SockJsClient和同一包中的类。

  • 当 STOMPClient 端订阅和取消订阅时,将发布新的应用程序上下文事件SessionSubscribeEventSessionUnsubscribeEvent

  • 新的“ websocket”作用域。参见第 26.4.16 节,“ WebSocket 范围”

  • @SendToUser只能定位单个会话,并且不需要经过身份验证的用户。

  • @MessageMapping方法可以使用点“。”而不是使用斜杠“ /”作为路径分隔符。参见SPR-11660

  • 收集并记录了 STOMP/WebSocket 监视信息。参见第 26.4.18 节,“监视”

  • 显着优化和改进的日志记录,即使在 DEBUG 级别也应保持可读性和紧凑性。

  • 优化的消息创建,包括对临时消息可变性的支持,并避免自动创建消息 ID 和时间戳。参见MessageHeaderAccessor的 Javadoc。

  • 构建 WebSocket 会话后 60 秒内,关闭没有活动的 STOMP/WebSocket 连接。参见SPR-11884

4.5 测试改进

  • Groovy 脚本现在可以用于配置为 TestContext 框架中的集成测试加载的ApplicationContext

  • 有关详情,请参见名为“使用 Groovy 脚本进行上下文配置”的部分

  • 现在,可以通过新的TestTransaction API 以编程方式在事务测试方法中开始和结束测试 Management 的事务。

  • 有关详情,请参见名为“程序化 TransactionManagement”的部分

  • 现在,可以基于每个类或每个方法通过新的@Sql@SqlConfig注解声明性地配置 SQL 脚本执行。

  • 有关详情,请参见第 15.5.8 节“执行 SQL 脚本”

  • 可以通过新的@TestPropertySourceComments 配置自动覆盖系统和应用程序属性源的测试属性源。

  • 有关详情,请参见名为“具有测试属性源的上下文配置”的部分

  • 现在可以自动发现默认的TestExecutionListener

  • 有关详情,请参见名为“自动发现默认的 TestExecutionListeners”的部分

  • 现在可以将自定义TestExecutionListener自动与默认侦听器合并。

  • 有关详情,请参见称为“合并 TestExecutionListeners”的部分

  • 通过更详尽的解释和更多示例,对 TestContext 框架中的事务测试支持文档进行了改进。

  • 有关详情,请参见第 15.5.7 节“事务 Management”

  • MockServletContextMockHttpServletRequest和其他 Servlet API 模拟的各种改进。

  • AssertThrows已重构为支持Throwable而不是Exception

  • 在 Spring MVC Test 中,可以使用JSON Assert来声明 JSON 响应,这是使用 JSONPath 的额外选项,就像使用 XMLUnit 对 XML 进行处理一样。

  • 现在可以在MockMvcConfigurer的帮助下创建MockMvcBuilder 食谱。添加它是为了使应用 Spring Security 设置变得容易,但可以用于封装任何第三方框架或项目内的通用设置。

  • MockRestServiceServer现在支持AsyncRestTemplate进行 Client 端测试。