5. Spring Framework 4.2 中的新功能和增强功能

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

5.1 核心容器的改进

  • 还可以在 Java 8 默认方法上检测并处理诸如@Bean之类的 Comments,从而可以从具有默认@Bean方法的接口组成配置类。

  • 配置类现在可以使用常规组件类声明@Import,从而允许混合使用导入的配置类和组件类。

  • 配置类可能会声明一个@Order值,即使通过 Classpath 扫描检测到该值,也会以相应的 Sequences 进行处理(例如,按名称覆盖 Bean)。

  • @Resource注入点支持@Lazy声明,类似于@Autowired,它接收请求的目标 bean 的延迟初始化代理。

  • 现在,应用程序事件基础结构提供了annotation-based model以及发布任意事件的功能。

  • 托管 Bean 中的任何公共方法都可以用@EventListenerComments 以使用事件。

    • @TransactionalEventListener提供事务绑定事件支持。
  • Spring Framework 4.2 引入了对声明和查找 Comments 属性别名的一流支持。新的@AliasFor注解可用于在单个注解中声明一对别名属性,或声明从自定义组合注解中的一个属性到元注解中的属性的别名。

  • @AliasFor支持已对以下 Comments 进行了改进,以便为其value属性提供有意义的别名:@Cacheable@CacheEvict@CachePut@ComponentScan@ComponentScan.Filter@ImportResource@Scope@ManagedResource@Header@Payload@SendToUser@ActiveProfiles@ContextConfiguration@Sql18_,@Transactional@ControllerAdvice@CookieValue@CrossOrigin@MatrixVariable@RequestHeader@RequestMapping@RequestParam@RequestPart@ResponseStatus@SessionAttributes@ActionMapping@RenderMapping@EventListener@TransactionalEventListener

    • 例如,来自spring-test模块的@ContextConfiguration现在声明如下:
public @interface ContextConfiguration {

    @AliasFor("locations")
    String[] value() default {};

    @AliasFor("value")
    String[] locations() default {};

    // ...
}
  • 类似地,从元 Comments 中覆盖属性的“组合 Comments”现在可以使用@AliasFor来精确控制在 Comments 层次结构中哪些属性被覆盖。实际上,现在可以为元 Comments 的value属性声明别名。

  • 例如,现在可以使用以下自定义属性重写来开发组合 Comments。

@ContextConfiguration
public @interface MyTestConfig {

    @AliasFor(annotation = ContextConfiguration.class, attribute = "value")
    String[] xmlFiles();

    // ...
}
  • See SpringComments 编程模型.

  • 对用于查找元 Comments 的 Spring 搜索算法进行了大量改进。例如,本地声明的“组合 Comments”现在比继承的 Comments 更受青睐。

  • 现在,可以在接口,抽象,bridge 和接口方法以及类,标准方法,构造函数和字段上发现覆盖元 Comments 属性的“组合 Comments”。

  • 可以将表示 Comments 属性(和AnnotationAttributes实例)的 Map“合成”(即转换)为 Comments。

  • 基于字段的数据绑定(DirectFieldAccessor)的功能已与当前基于属性的数据绑定(BeanWrapper)对齐。特别是,基于字段的绑定现在支持对 Collections,Arrays 和 Maps 的导航。

  • DefaultConversionService现在为StreamCharsetCurrencyTimeZone提供了开箱即用的转换器。这样的转换器也可以单独添加到任意ConversionService中。

  • DefaultFormattingConversionService附带了对 JSR-354 货币和货币(如果 Classpath 中存在“ javax.money” API 的)中的值类型的现成支持:MonetaryAmountCurrencyUnit。这包括对应用@NumberFormat的支持。

  • @NumberFormat现在可以用作元 Comments。

  • JavaMailSenderImpl具有新的testConnection()方法,用于检查与服务器的连接。

  • ScheduledTaskRegistrar公开计划的任务。

  • 现在,池 AOP CommonsPool2TargetSource支持 Apache commons-pool2

  • 引入StandardScriptFactory作为基于 JSR-223 的脚本化 bean 的机制,通过 XML 的lang:std元素公开。支持例如 JavaScript 和 JRuby。 (注意:现在不建议使用 JRubyScriptFactory 和lang:jruby,而建议使用 JSR-223.)

5.2 数据访问改进

  • 现在通过 AspectJ 支持javax.transaction.Transactional

  • SimpleJdbcCallOperations现在支持命名绑定。

  • 完全支持 Hibernate ORM 5.0:作为 JPA 提供程序(自动改编)以及通过其本机 API(由新的org.springframework.orm.hibernate5包覆盖)。

  • 现在可以自动为嵌入式数据库分配唯一的名称,并且<jdbc:embedded-database>支持新的database-name属性。有关更多详细信息,请参见下面的“测试改进”。

5.3 JMS 改进

  • autoStartup属性可以通过JmsListenerContainerFactory进行控制。

  • 现在可以为每个侦听器容器配置回复Destination的类型。

  • @SendTo注解的值现在可以使用 SpEL 表达式。

  • 响应目标可以是使用 JmsResponse 在运行时计算

  • @JmsListener现在是一个可重复的注解,用于以相同的方法声明多个 JMS 容器(如果尚未使用 Java8,则使用新引入的@JmsListeners)。

5.4 Web 改进

  • HTTP 流和服务器发送事件支持,请参阅称为“ HTTP 流”的部分

  • 对 CORS 的内置支持,包括全局(MVC Java 配置和 XML 名称空间)和本地(例如@CrossOrigin)配置。有关详情,请参见第 27 章,CORS 支持

  • HTTP 缓存更新:

  • 新的CacheControl构建器;已插入ResponseEntityWebContentGeneratorResourceHttpRequestHandler

    • WebRequest中改进了 ETag/Last-Modified 支持。
  • 使用@RequestMapping作为元 Comments 的自定义 MapComments。

  • AbstractHandlerMethodMapping中的公共方法用于在运行时注册和注销请求 Map。

  • AbstractDispatcherServletInitializer中受保护的createDispatcherServlet方法可进一步自定义要使用的DispatcherServlet实例。

  • HandlerMethod作为@ExceptionHandler方法的方法参数,在@ControllerAdvice组件中特别方便。

  • java.util.concurrent.CompletableFuture作为@Controller方法的返回值类型。

  • HttpHeaders中的字节范围请求支持以及用于提供静态资源。

  • 在嵌套异常中检测到@ResponseStatus

  • RestTemplate中的UriTemplateHandler扩展点。

  • DefaultUriTemplateHandler公开baseUrl属性和路径段编码选项。

    • 扩展点还可以用于插入任何 URI 模板库。
  • OkHTTPRestTemplate集成。

  • 自定义baseUrl替代MvcUriComponentsBuilder中的方法。

  • 序列化/反序列化异常消息现在以 WARN 级别记录。

  • 默认 JSON 前缀已从“{} &&”更改为更安全的“)]}',”一。

  • 新的RequestBodyAdvice扩展点和内置实现支持@RequestBody方法参数上的 Jackson 的@JsonView

  • 当使用 GSON 或 Jackson 2.6 时,处理程序方法返回类型用于改善List<Foo>之类的参数化类型的序列化。

  • 引入ScriptTemplateView作为基于 JSR-223 的脚本化 Web 视图的机制,重点关注基于 Nashorn 的 JavaScript 视图模板(JDK 8)。

5.5 WebSocket 消息传递的改进

  • 公开有关已连接用户和订阅的状态信息:

  • 新的SimpUserRegistry公开为名为“ userRegistry”的 bean。

    • 在服务器集群之间共享状态信息(请参阅代理中继配置选项)。
  • 在服务器集群之间解析用户目标(请参阅代理中继配置选项)。

  • StompSubProtocolErrorHandler扩展点用于自定义和控制 Client 端的 STOMP ERROR 帧。

  • 通过@ControllerAdvice个组件的全局@MessageExceptionHandler个方法。

  • 带有SimpleBrokerMessageHandler的订阅的心跳和 SpEL 表达式“selectors”Headers。

  • 用于 TCP 和 WebSocket 的 STOMPClient 端;参见第 26.4.15 节,“ STOMPClient 端”

  • @SendTo@SendToUser可以包含目标变量占位符。

  • Jackson 的@JsonView支持@MessageMapping@SubscribeMapping方法的返回值。

  • ListenableFutureCompletableFuture作为@MessageMapping@SubscribeMapping方法的返回值类型。

  • MarshallingMessageConverter用于 XML 有效负载。

5.6 测试改进

  • 现在,可以使用 JUnit 规则而不是SpringJUnit4ClassRunner来执行基于 JUnit 的集成测试。这允许基于 Spring 的集成测试可以与 JUnit 的Parameterized之类的替代运行程序或MockitoJUnitRunner之类的第三方运行程序一起运行。

  • 有关详情,请参见“ Spring JUnit 4 规则”一节

  • Spring MVC Test 框架现在提供对 HtmlUnit 的一流支持,包括与 Selenium 的 WebDriver 集成,从而允许基于页面的 Web 应用程序测试,而无需部署到 Servlet 容器。

  • 有关详情,请参见第 15.6.2 节“ HtmlUnit 集成”

  • AopTestUtils是一种新的测试 Util,允许开发人员获取对隐藏在一个或多个 Spring 代理之后的基础目标对象的引用。

  • 有关详情,请参见第 14.2.1 节“常规测试 Util”

  • ReflectionTestUtils现在支持设置和获取static字段,包括常量。

  • 现在保留通过@ActiveProfiles声明的 Bean 定义配置文件的原始 Sequences,以支持诸如 Spring Boot 的ConfigFileApplicationListener之类的用例,这些用例基于活动配置文件的名称加载配置文件。

  • @DirtiesContext支持新的BEFORE_METHODBEFORE_CLASSBEFORE_EACH_TEST_METHOD模式,用于*在测试之前关闭ApplicationContext-例如,如果大型测试套件中的某些恶意测试(即,尚未确定)破坏了ApplicationContext的原始配置。

  • @Commit是一个新 Comments,可以直接替代@Rollback(false)

  • @Rollback现在可以用于配置类级别的* default rollback *语义。

  • 因此,@TransactionConfiguration现在已被弃用,并将在后续发行版中删除。

  • @Sql现在支持通过新的statements属性执行内联 SQL 语句

  • 现在,用于在测试之间缓存ApplicationContextContextCache现在是具有默认实现的公共 API,可以将其替换为自定义缓存需求。

  • DefaultTestContextDefaultBootstrapContextDefaultCacheAwareContextLoaderDelegate现在是support子程序包中的公共类,允许自定义扩展。

  • TestContextBootstrapper现在负责构建TestContext

  • 在 Spring MVC 测试框架中,现在可以在DEBUG级别记录MvcResult详细信息或将其写入自定义OutputStreamWriter。有关详细信息,请参见MockMvcResultHandlers中新的log()print(OutputStream)print(Writer)方法。

  • JDBC XML 名称空间在<jdbc:embedded-database>中支持新的database-name属性,从而使开发人员可以设置嵌入式数据库的唯一名称,例如,通过 SpEL 表达式或受当前活动 bean 定义配置文件影响的属性占位符。

  • 现在可以自动为嵌入式数据库分配一个唯一的名称,从而允许在测试套件中的不同ApplicationContext中重用通用的测试数据库配置。

  • 有关详情,请参见第 19.8.6 节“为嵌入式数据库生成唯一名称”

  • MockHttpServletRequestMockHttpServletResponse现在通过getDateHeadersetDateHeader方法提供了对日期 Headers 格式的更好支持。