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

Version 4.1 包含了许多改进,如以下部分所述:

4.1 JMS 改进

Spring 4.1 通过使用@JmsListener注释 bean 方法引入了更简单的基础结构注册 JMS listener endpoints。 XML 命名空间已得到增强,可支持这种新样式(jms:annotation-driven),并且还可以使用 Java 配置(@EnableJmsJmsListenerContainerFactory)完全配置基础结构。也可以使用JmsListenerConfigurer以编程方式注册 listener endpoints。

Spring 4.1 也使其 JMS 支持对齐,以便您从 4.0 中引入的spring-messaging抽象中受益,即:

  • 消息 listener endpoints 可以具有更灵活的签名,并从标准消息传递注释中受益,例如@Payload@Header@Headers@SendTo。也可以使用标准Message代替javax.jms.Message作为方法参数。

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

最后,Spring 4.1 提供了额外的其他改进:

  • JmsTemplate中的同步 request-reply 操作支持

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

  • 可以使用退避 implementation 配置消息 listener 容器的恢复选项

  • 支持 JMS 2.0 共享消费者

4.2 缓存改进

Spring 4.1 使用 Spring 现有的缓存配置和基础设施抽象支持JCache(JSR-107)注释;使用标准注释不需要进行任何更改。

Spring 4.1 还显着改进了自己的缓存抽象:

  • 可以使用CacheResolver在运行时解析缓存。因此,定义要使用的缓存 name(s 的value参数不再是必需的。

  • 更多 operation-level 自定义:缓存解析器,缓存 manager,key generator

  • 新的@CacheConfig class-level annotation允许在 class level **中共享 common 设置,而不启用任何缓存操作。

  • 使用CacheErrorHandler更好地 exception 处理缓存方法

Spring 4.1 在Cache界面中也发生了重大变化,因为添加了新的putIfAbsent方法。

4.3 Web 改进

  • 基于ResourceHttpRequestHandler的现有资源处理支持已经扩展了新的抽象ResourceResolverResourceTransformerResourceUrlProvider。许多 built-in implementations 支持版本化资源 URL(用于有效的 HTTP 缓存),定位 gzip 压缩资源,生成 HTML 5 AppCache 清单等。见第 22.16.9 节,“资源服务”

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

  • 支持ListenableFuture作为DeferredResult的 return value 替代,其中底层服务(或者可能是对AsyncRestTemplate的调用)已经返回ListenableFuture

  • @ModelAttribute方法现在在尊重 inter-dependencies 的 order 中调用。见SPR-6299

  • Jackson 的@JsonView直接支持@ResponseBodyResponseEntity控制器方法,用于序列化相同 POJO 的不同数量的详细信息(e.g. 摘要与详细信息页面)。通过在特殊 key 下添加序列化视图类型作为 model 属性,View-based 渲染也支持这一点。有关详细信息,请参阅“Jackson 序列化视图支持”一节

  • JJP 现在受 Jackson 支持。见这节名为“Jackson JSONP 支持”

  • 新的生命周期选项可用于在控制器方法返回之后和写入响应之前拦截@ResponseBodyResponseEntity方法。利用声明一个实现ResponseBodyAdvice@ControllerAdvice bean。对@JsonView和 JSONP 的 built-in 支持利用了这一点。见部分 22.4.1,“使用 HandlerInterceptor 拦截请求”

  • 有三个新的HttpMessageConverter选项:

  • Gson - 比 Jackson 更轻的足迹;已经在 Spring Android 中使用。

  • Google 协议缓冲区 - 作为企业内的 inter-service 通信数据协议高效且有效,但也可以作为浏览器的 JSON 和 XML 公开。

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

  • 诸如 JSP 之类的视图现在可以通过引用 name 的控制器映射来构建到控制器的链接。每个@RequestMapping都分配一个默认的 name。对于 example FooController,方法handleFoo被命名为“FC#handleFoo”。命名策略是可插拔的。也可以通过 name 属性显式 name @RequestMapping。 Spring JSP 标记 library 中的新mvcUrl function 使其易于在 JSP 页面中使用。见部分 22.7.3,“构建控制器的 URI 和视图中的方法”

  • ResponseEntity提供 builder-style API 来指导控制器方法准备 server-side 响应 e.g. ResponseEntity.ok()

  • RequestEntity是一种新类型,它提供 builder-style API 来指导 client-side REST code 以准备 HTTP 请求。

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

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

  • 视图控制器现在具有 built-in 支持重定向和设置响应状态。 application 可以使用它来配置重定向 URL,使用视图呈现 404 响应,发送“无内容”响应等。一些用例是在这里列出

  • 经常使用路径匹配自定义,现在 built-in。见第 22.16.11 节,“路径匹配”

  • Groovy 标记模板支持(基于 Groovy 2.3)。请参阅GroovyMarkupConfigurer并重新选择ViewResolver和`查看'implementations。

4.4 WebSocket 消息传递改进

  • SockJS(Java)client-side 支持。请参阅同一包中的SockJsClient和 classes。

  • 当 STOMP clients 订阅和取消订阅时,发布了新的 application context events SessionSubscribeEventSessionUnsubscribeEvent

  • 新的“websocket”范围。见第 26.4.16 节,“WebSocket 范围”

  • @SendToUser只能定位一个 session,不需要经过身份验证的用户。

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

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

  • 显着优化和改进的 logging,即使在 DEBUG level 中也应保持非常可读和紧凑。

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

  • 在建立 WebSocket session 后的 60 秒内关闭没有活动的 STOMP/WebSocket 连接。见SPR-11884

4.5 测试改进

  • Groovy 脚本现在可用于在 TestContext framework 中配置ApplicationContext加载的 integration 测试。

  • 有关详细信息,请参阅名为“Context configuration with Groovy scripts”的部分

  • Test-managed transactions 现在可以通过新的TestTransaction API 以编程方式启动并在 transactional 测试方法中结束。

  • 有关详细信息,请参阅名为“Programmatic transaction management”的部分

  • 现在可以通过 per-class 或 per-method 基础上的新@Sql@SqlConfig 注释以声明方式配置 SQL 脚本执行。

  • 有关详细信息,请参阅第 15.5.8 节,“执行 SQL 脚本”

  • 可以通过新的@TestPropertySource annotation 配置自动覆盖 system 和 application property 源的测试 property 源。

  • 有关详细信息,请参阅名为“Context configuration with test property sources”的部分

  • 现在可以自动发现默认TestExecutionListener s。

  • 有关详细信息,请参阅“自动发现默认 TestExecutionListeners”一节

  • 自定义TestExecutionListener现在可以自动与默认 listeners 合并。

  • 有关详细信息,请参阅名为“合并 TestExecutionListeners”的部分

  • TestContext framework 中的 transactional 测试支持文档已经过更全面的解释和其他示例的改进。

  • 有关详细信息,请参阅第 15.5.7 节,“交易管理”

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

  • AssertThrows已经过重构以支持Throwable而不是Exception

  • 在 Spring MVC Test 中,JSON 响应可以使用JSON 断言作为使用 JSONPath 的额外选项来声明,就像使用 XMLUnit 可以为 XML 做的那样。

  • 现在可以在MockMvcConfigurer的帮助下创建MockMvcBuilder食谱。添加它是为了便于应用 Spring Security 设置,但可以用于封装任何第三方 framework 或项目中的 common 设置。

  • MockRestServiceServer现在支持AsyncRestTemplate进行 client-side 测试。