Spring 3.1 新特性

Spring 3.1带来了多项有用的新特性和增强, 其中有很多都是关于如何简化和改善配置的。 除此之外, Spring 3.1还提供了声明式缓存的支持以及众多针对Spring MVC的功能增强。
除了Spring 3.1所提供的新功能以外, 同等重要的是要注意Spring 3.1不再支持的功能。 具体来讲, 为了支持原生的EntityManager, Spring的JpaTemplate和JpaDaoSupport类被废弃掉了。 尽管它们已经被废弃了, 但直到Spring 3.2版本, 它依然是可以使用的。 但最好不要再使用它们了, 因为它们不会进行更新以支持JPA 2.0, 并且已经在Spring 4中移除掉了。

下面的列表展现了Spring 3.1重要的功能升级:

  • 为了解决各种环境下(如开发、 测试和生产) 选择不同配置的问题, Spring 3.1引入了环境profile功能。 借助于profile, 就能根据应用部署在什么环境之中选择不同的数据源bean;
  • 在Spring 3.0基于Java的配置之上, Spring 3.1添加了多个enable注解, 这样就能使用这个注解启用Spring的特定功能;
  • 添加了Spring对声明式缓存的支持, 能够使用简单的注解声明缓存边界和规则, 这与你以前声明事务边界很类似;
  • 新添加的用于构造器注入的c命名空间, 它类似于Spring 2.0所提供的面向属性的p命名空间, p命名空间用于属性注入, 它们都是非常简洁易用的;
  • Spring开始支持Servlet 3.0, 包括在基于Java的配置中声明Servlet和Filter, 而不再借助于web.xml;
  • 改善Spring对JPA的支持, 使得它能够在Spring中完整地配置JPA, 不必再使用persistence.xml文件。

Spring 3.1还包含了多项针对Spring MVC的功能增强:

  • 自动绑定路径变量到模型属性中;
  • 提供了@RequestMappingproduces和consumes属性, 用于匹配请求中的Accept和Content-Type头部信息;
  • 提供了@RequestPart注解, 用于将multipart请求中的某些部分绑定到处理器的方法参数中;
  • 支持Flash属性(在redirect请求之后依然能够存活的属性) 以及用于在请求间存放flash属性的RedirectAttributes类型。

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之前, 只能通过ContentNegotiatingViewResolver使用完整的内容协商(full content negotiation) 功能。 但是在Spring 3.2中, 完整的内容协商功能可以在整个Spring MVC中使用, 即便是依赖于消息转换器(message converter) 使用和产生内容的控制器方法也能使用该功能;
  • Spring MVC 3.2包含了一个新的@MatrixVariable注解, 这个注解能够将请求中的矩阵变量(matrix variable) 绑定到处理器的方法参数中;
  • 基础的抽象类AbstractDispatcherServletInitializer能够非常便利地配置DispatcherServlet, 而不必再使用56web.xml。 与之类似, 当你希望通过基于Java的方式来配置Spring的时候, 可以使用Abstract- AnnotationConfigDispatcherServletInitializer的子类;
  • 新增了ResponseEntityExceptionHandler, 可以用来替代Default- HandlerExceptionResolver。 ResponseEntityExceptionHandler方法会返回ResponseEntity, 而不是ModelAndView;
  • RestTemplate和@RequestBody的参数可以支持范型;
  • RestTemplate和@RequestMapping可以支持HTTP PATCH方法;
  • 在拦截器匹配时, 支持使用URL模式将其排除在拦截器的处理功能之外。

非Spring MVC新特性:

  • @Autowired、 @Value和@Bean注解能够作为元注解, 用于创建自定义的注入和bean声明注解;
  • @DateTimeFormat注解不再强依赖JodaTime。 如果提供了JodaTime, 就会使用它, 否则的话, 会使用SimpleDateFormat;
  • Spring的声明式缓存提供了对JCache 0.5的支持;
  • 支持定义全局的格式来解析和渲染日期与时间;
  • 在集成测试中, 能够配置和加载WebApplicationContext;
  • 在集成测试中, 能够针对request和session作用域的bean进行测试。

Spring 4.0新特性

  • Spring提供了对WebSocket编程的支持, 包括支持JSR-356——Java API for WebSocket;
  • 鉴于WebSocket仅仅提供了一种低层次的API, 急需高层次的抽象, 因此Spring 4.0在WebSocket之上提供了一个高层次的面向消息的编程模型, 该模型基于SockJS, 并且包含了对STOMP协议的支持;
  • 新的消息(messaging) 模块, 很多的类型来源于Spring Integration项目。 这个消息模块支持Spring的SockJS/STOMP功能, 同时提供了基于模板的方式发布消息;
  • Spring是第一批(如果不说是第一个的话) 支持Java 8特性的Java框架, 比如它所支持的lambda表达式。 别的暂且不说, 这首先能够让使用特定的回调接口(如RowMapper和JdbcTemplate)更加简洁, 代码更加易读;
  • 与Java 8同时得到支持的是JSR-310——Date与Time API, 在处理日期和时间时, 它为开发者提供了比java.util.Date或java.util.Calendar更丰富的API;
  • 为Groovy开发的应用程序提供了更加顺畅的编程体验, 尤其是支持非常便利地完全采用Groovy开发Spring应用程序。 随这些一起提供的是来自于Grails的BeanBuilder, 借助它能够通过Groovy配置Spring应用;
  • 添加了条件化创建bean的功能, 在这里只有开发人员定义的条件满足时, 才会创建所声明的bean;
  • Spring 4.0包含了Spring RestTemplate的一个新的异步实现,它会立即返回并且允许在操作完成后执行回调;
  • 添加了对多项JEE规范的支持, 包括JMS 2.0、 JTA 1.2、 JPA 2.1和Bean Validation 1.1。