4. Spring Framework 4.1 中的新功能和增强功能
4.1 版包括许多改进,如以下各节所述:
4.1 JMS 改进
Spring 4.1 通过使用@JmsListenerCommentsbean 方法,引入了一个更简单的基础结构注册 JMS 侦听器端点。 XML 名称空间已得到增强,以支持此新样式(jms:annotation-driven
),并且还可以使用 Java config(@EnableJms,JmsListenerContainerFactory
)完全配置基础结构。也可以使用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
的资源处理的现有支持已扩展为新的抽象ResourceResolver
,ResourceTransformer
和ResourceUrlProvider
。许多内置实现提供对版本化资源 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。 -
@ResponseBody
和ResponseEntity
控制器方法直接支持 Jackson 的@JsonView
,用于序列化同一 POJO 的不同数量的细节(例如,摘要页面与细节页面)。通过将序列化视图类型添加为特殊键下的模型属性,基于视图的渲染也支持此功能。有关详情,请参见名为“ Jackson 序列化视图支持”的部分。 -
Jackson 现在支持 JSONP。参见名为“ Jackson JSONP 支持”的部分。
-
在控制器方法返回之后和写入响应之前,可以使用新的生命周期选项来拦截
@ResponseBody
和ResponseEntity
方法。要利用这个优势,请声明一个实现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
。例如,使用方法handleFoo
的FooController
被命名为“ 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 端订阅和取消订阅时,将发布新的应用程序上下文事件
SessionSubscribeEvent
和SessionUnsubscribeEvent
。 -
新的“ 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 脚本”。
-
可以通过新的
@TestPropertySource
Comments 配置自动覆盖系统和应用程序属性源的测试属性源。 -
有关详情,请参见名为“具有测试属性源的上下文配置”的部分。
-
现在可以自动发现默认的
TestExecutionListener
。 -
现在可以将自定义
TestExecutionListener
自动与默认侦听器合并。 -
有关详情,请参见称为“合并 TestExecutionListeners”的部分。
-
通过更详尽的解释和更多示例,对 TestContext 框架中的事务测试支持文档进行了改进。
-
有关详情,请参见第 15.5.7 节“事务 Management”。
-
MockServletContext
,MockHttpServletRequest
和其他 Servlet API 模拟的各种改进。 -
AssertThrows
已重构为支持Throwable
而不是Exception
。 -
在 Spring MVC Test 中,可以使用JSON Assert来声明 JSON 响应,这是使用 JSONPath 的额外选项,就像使用 XMLUnit 对 XML 进行处理一样。
-
现在可以在
MockMvcConfigurer
的帮助下创建MockMvcBuilder
食谱。添加它是为了使应用 Spring Security 设置变得容易,但可以用于封装任何第三方框架或项目内的通用设置。 -
MockRestServiceServer
现在支持AsyncRestTemplate
进行 Client 端测试。