1.4.2 Spring 3.2 新特性

Spring 3.1 在很大程度上聚焦于配置改善以及其他的一些增强,包括 Spring MVC 的增强,而 Spring 3.2 是主要关注 Spring MVC 的一个发布版本。Spring MVC 3.2 带来了如下的功能提升:

  • Spring 3.2 的控制器(Controller)可以使用 Servlet 3.0 的异步请求,允许在一个独立的线程中处理请求,从而将 Servlet 线程解放出来处理更多的请求;

  • 尽管从 Spring 2.5 开始,Spring MVC 控制器就能以 POJO 的形式进行很便利地测试,但是 Spring 3.2 引入了 Spring MVC 测试框架,用于为控制器编写更为丰富的测试,断言它们作为控制器的行为行为是否正确,而且在使用的过程中并不需要 Servlet 容器;

  • 除了提升控制器的测试功能,Spring 3.2 还包含了基于 RestTemplate 的客户端的测试支持,在测试的过程中,不需要往真正的 REST 端点上发送请求;

  • @ControllerAdvice 注解能够将通用的 @ExceptionHandler、@InitBinder 和 @ModelAttributes 方法收集到一个类中,并应用到所有控制器上;

  • 在 Spring 3.2 之前,只能通过 ContentNegotiatingViewResolve r使用完整的内容协商(full content negotiation)功能。但是在 Spring 3.2 中,完整的内容协商功能可以在整个 Spring MVC 中使用,即便是依赖于消息转换器(message converter)使用和产生内容的控制器方法也能使用该功能;

  • Spring MVC 3.2 包含了一个新的 @MatrixVariable 注解,这个注解能够将请求中的矩阵变量(matrix variable)绑定到处理器的方法参数中;

  • 基础的抽象类 AbstractDispatcherServletInitializer 能够非常便利地配置 DispatcherServlet,而不必再使用 web.xml。与之类似,当你希望通过基于Java 的方式来配置 Spring 的时候,可以使用 AbstractAnnotationConfigDispatcherServletInitializer 的子类;

  • 新增了 ResponseEntityExceptionHandler,可以用来替代 DefaultHandlerExceptionResolver。ResponseEntityExceptionHandler 方法会返回 ResponseEntity,而不是 ModelAndView;

  • RestTemplate 和 @RequestBody 的参数可以支持范型;

  • RestTemplate 和 @RequestMapping 可以支持 HTTP PATCH 方 法;

  • 在拦截器匹配时,支持使用 URL 模式将其排除在拦截器的处理功能之外。

虽然 Spring MVC 是 Spring 3.2 改善的核心内容,但是它依然还增加了多项非 MVC 的功能改善。下面列出了 Spring 3.2 中几项最为有意思的新特性:

  • @Autowired、@Value 和 @Bean 注解能够作为元注解,用于创建自定义的注入和 bean 声明注解;

  • @DateTimeFormat 注解不再强依赖 JodaTime。如果提供了 JodaTime,就会使用它,否则的话,会使用SimpleDateFormat;

  • Spring 的声明式缓存提供了对 JCache 0.5 的支持;

  • 支持定义全局的格式来解析和渲染日期与时间;

  • 在集成测试中,能够配置和加载 WebApplicationContext;

  • 在集成测试中,能够针对 request 和 session 作用域的 bean 进行测 试。

在本书的多个章节中,都能看到 Spring 3.2 的特性,尤其是在 Web 和 REST 相关的章节中。

Last updated