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

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

  • 第 5.1 节,“核心容器改进”

  • 第 5.2 节,“数据访问改进”

  • 第 5.3 节,“JMS 改进”

  • 第 5.4 节,“ Web 改进”

  • 第 5.5 节,“WebSocket 消息传递改进”

  • 第 5.6 节,“测试改进”

5.1 核心容器改进

  • 注释也可以在 Java 8 默认方法上检测和处理@Bean等注释,允许使用默认@Bean方法从接口编写 configuration class。

  • Configuration classes 现在可以使用常规 component classes 声明@Import,允许混合导入的 configuration classes 和 component classes。

  • Configuration classes 可以声明一个@Order value,即使通过 classpath 扫描检测到,也会在相应的 order(e.g. 覆盖 beans by name)中进行处理。

  • @Resource注入点支持@Lazy声明,类似于@Autowired,为请求的目标 bean 接收 lazy-initializing 代理。

  • application event 基础结构现在提供annotation-based model以及发布任意 event 的能力。

  • 托管 bean 中的任何公共方法都可以使用@EventListener进行注释以使用 events。

  • @TransactionalEventListener提供 transaction-bound event 支持。

  • Spring Framework 4.2 引入了 first-class 支持,用于声明和查找 annotation 属性的别名。新的@AliasFor annotation 可用于在单个 annotation 中声明一对别名属性,或者将自定义组合 annotation 中的一个属性的别名声明为 meta-annotation 中的属性。

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

  • 对于 example,spring-test模块中的@ContextConfiguration现在声明如下:

public @interface ContextConfiguration {

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

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

    // ...
}
  • 类似地,覆盖 meta-annotations 属性的组合注释现在可以使用@AliasFor进行 fine-grained 控制,以确切地在 annotation 层次结构中覆盖哪些属性。实际上,现在可以为 meta-annotation 的value属性声明别名。

  • 对于 example,现在可以使用自定义属性覆盖开发组合注释,如下所示。

@ContextConfiguration
public @interface MyTestConfig {

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

    // ...
}
  • 见Spring Annotation Programming Model。

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

  • 现在可以在接口和 abstract,bridge 和接口方法以及 classes,标准方法,构造函数和字段上发现组合的 annotations,它们覆盖 meta-annotations 中的属性。

  • 表示 annotation 属性(和AnnotationAttributes实例)的 Maps 可以合成(i.e.,转换)为 annotation。

  • field-based data binding(DirectFieldAccessor)的 features 已与当前的 property-based data binding(BeanWrapper)对齐。特别是,field-based binding 现在支持集合,数组和 Maps 的导航。

  • DefaultConversionService现在为StreamCharsetCurrencyTimeZone提供 out-of-the-box 转换器。这些转换器也可以单独添加到任意ConversionService

  • DefaultFormattingConversionService为 JSR-354 Money&Currency 中的 value 类型提供 out-of-the-box 支持(如果 classpath 中存在'javax.money'API):即MonetaryAmountCurrencyUnit。这包括支持申请@NumberFormat

  • @NumberFormat现在可以用作 meta-annotation。

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

  • ScheduledTaskRegistrar公开计划任务。

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

  • 引入StandardScriptFactory作为基于 JSR-223 的脚本 beans 机制,通过 XML 中的lang:std元素公开。支持 e.g. JavaScript 和 JRuby。 (注意:现在不推荐使用 JRubyScriptFactory 和lang:jruby,支持使用 JSR-223.)

5.2 数据访问改进

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

  • SimpleJdbcCallOperations现在支持名为 binding。

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

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

5.3 JMS 改进

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

  • 现在可以根据 listener 容器配置回复Destination的类型。

  • @SendTo annotation 的 value 现在可以使用 SpEL 表达式。

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

  • @JmsListener现在是一个可重复的 annotation,用于在同一个方法上声明几个 JMS 容器(如果你还没有使用 Java8,则使用新引入的@JmsListeners)。

5.4 Web 改进

  • HTTP Streaming 和 Server-Sent Events 支持,请参阅称为“HTTP Streaming”的部分。

  • Built-in 支持 CORS,包括 global(MVC Java 配置和 XML 命名空间)和本地(e.g. @CrossOrigin)configuration。有关详细信息,请参阅第 27 章,CORS 支持。

  • HTTP 缓存更新:

  • CacheControl建设者;插入ResponseEntityWebContentGeneratorResourceHttpRequestHandler

  • WebRequest中改进了 ETag/Last-Modified 支持。

  • 自定义映射注释,使用@RequestMapping作为 meta-annotation。

  • AbstractHandlerMethodMapping中的公共方法在运行时注册和取消注册请求映射。

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

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

  • java.util.concurrent.CompletableFuture作为@Controller方法 return value 类型。

  • Byte-range 请求HttpHeaders中的支持和服务静态资源。

  • 在嵌套的 exceptions 上检测到@ResponseStatus

  • RestTemplate中的UriTemplateHandler扩展点。

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

  • 扩展点也可用于插入任何 URI 模板 library。

  • OkHTTP 与RestTemplate整合。

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

  • Serialization/deserialization exception 消息现在记录在 WARN level 中。

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

  • 新的RequestBodyAdvice扩展点和 built-in implementation 在@RequestBody方法 arguments 上支持 Jackson 的@JsonView

  • 使用 GSON 或 Jackson 2.6 时,处理程序方法 return 类型用于改进参数化类型(如List<Foo>)的序列化。

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

5.5 WebSocket 消息传递改进

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

  • new SimpUserRegistry公开为 bean,名为“userRegistry”。

  • 跨服务器 cluster 共享在线信息(参见 broker relay config options)。

  • 跨服务器的 cluster 解析用户目标(请参阅 broker relay 配置选项)。

  • StompSubProtocolErrorHandler扩展点用于自定义和控制 STOMP ERROR 帧到 clients。

  • Global @MessageExceptionHandler方法通过@ControllerAdvice组件。

  • Heart-beats 和用于SimpleBrokerMessageHandler订阅的 SpEL 表达式'selector'标头。

  • STOMP client 用于 TCP 和 WebSocket;见第 26.4.15 节,“STOMP Client”。

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

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

  • ListenableFutureCompletableFuture作为@MessageMapping@SubscribeMapping方法的 return value 类型。

  • MarshallingMessageConverter表示 XML 有效负载。

5.6 测试改进

  • JUnit-based integration 测试现在可以使用 JUnit 规则而不是SpringJUnit4ClassRunner执行。这允许 Spring-based integration 测试与 JUnit 的Parameterized或 third-party 跑步者(如MockitoJUnitRunner)等替代跑步者一起运行。

  • 有关详细信息,请参阅名为“Spring JUnit 4 Rules”的部分。

  • Spring MVC Test framework 现在为 HtmlUnit 提供 first-class 支持,包括与 Selenium 的 WebDriver 的 integration,允许进行 page-based web application 测试而无需部署到 Servlet 容器。

  • 有关详细信息,请参阅第 15.6.2 节,“HtmlUnit Integration”。

  • AopTestUtils是一个新的测试实用程序,它允许开发人员获取隐藏在一个或多个 Spring 代理后面的基础目标 object 的 reference。

  • 有关详细信息,请参阅第 14.2.1 节,“一般测试实用程序”。

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

  • 通过@ActiveProfiles声明的 bean 定义 profiles 的原始 ordering 现在保留在 order 中,以支持 Spring Boot 的ConfigFileApplicationListener等用例,它根据 active profiles 的名称加载 configuration files。

  • @DirtiesContext支持新的BEFORE_METHODBEFORE_CLASSBEFORE_EACH_TEST_METHOD模式以在测试之前关闭ApplicationContext - 对于 example,如果在大型测试套件中测试某些恶意(i.e.,尚未确定)已损坏ApplicationContext的原始 configuration。

  • @Commit是一个新的注释,可以用作@Rollback(false)的直接替代。

  • @Rollback现在可用于配置 class-level 默认回滚语义。

  • 因此,@TransactionConfiguration现已弃用,将在后续版本中删除。

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

  • 用于在测试之间缓存ApplicationContextContextCache现在是一个带有默认 implementation 的公共 API,可以替换自定义缓存需求。

  • DefaultTestContextDefaultBootstrapContextDefaultCacheAwareContextLoaderDelegate现在是support子包中的公共 classes,允许自定义 extensions。

  • TestContextBootstrapper现在负责 building 。

  • 在 Spring MVC Test framework 中,MvcResult详细信息现在可以在DEBUG level 中记录或写入自定义OutputStreamWriter。有关详细信息,请参阅MockMvcResultHandlers中的新log()print(OutputStream)print(Writer)方法。

  • JDBC XML 名称空间支持<jdbc:embedded-database>中的新database-name属性,允许开发人员为嵌入式数据库设置唯一名称 - 例如,通过 SpEL 表达式或受当前 active bean 定义 profiles 影响的 property 占位符。

  • 嵌入式数据库现在可以自动分配一个唯一的 name,允许 common 测试数据库 configuration 在测试套件中的不同ApplicationContext中重用。

  • 有关详细信息,请参阅第 19.8.6 节,“为嵌入式数据库生成唯一名称”。

  • MockHttpServletRequestMockHttpServletResponse现在通过getDateHeadersetDateHeader方法为 date 标题格式提供更好的支持。