6. Spring Framework 4.3 中的新 Features 和增强功能

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

6.1 核心容器改进

  • 核心容器 exceptions 提供更丰富的元数据以便以编程方式进行评估。

  • Java 8 默认方法被检测为 bean property getters/setters。

  • 在注入主 bean 的情况下,不会创建惰性候选 beans。

  • 如果目标 bean 仅定义一个构造函数,则不再需要指定@Autowired annotation。

  • @Configuration classes 支持构造函数注入。

  • 用于指定@EventListenercondition的任何 SpEL 表达式现在都可以引用 beans(e.g .@beanName.method())。

  • 组合的 annotations 现在可以使用 array 的 component 类型的单个元素覆盖 meta-annotations 中的 array 属性。对于 example,@RequestMappingString[] path属性可以在组合的 annotation 中用String path覆盖。

  • 如果声明为@PersistenceContext/@PersistenceUnit,则选择主EntityManagerFactory bean。

  • @Scheduled@Schedules现在可以用作 meta-annotations 来创建具有属性覆盖的自定义组合注释。

  • 任何范围的 beans 都支持@Scheduled

6.2 数据访问改进

  • jdbc:initialize-databasejdbc:embedded-database支持可应用于每个脚本的可配置分隔符。

6.3 缓存改进

Spring 4.3 允许对给定 key 上的并发 calls 进行同步,以便 value 仅计算一次。这是一个 opt-in feature,应该通过@Cacheable上的新sync属性启用。这个 features 引入了Cache接口的重大变化,因为添加了get(Object key, Callable<T> valueLoader)方法。

Spring 4.3 还改进了缓存抽象,如下所示:

  • caches-related annotations 中的 SpEL 表达式现在可以引用 beans(i.e.@beanName.method())。

  • ConcurrentMapCacheManagerConcurrentMapCache现在支持通过新的storeByValue属性序列化缓存条目。

  • @Cacheable@CacheEvict@CachePut@Caching现在可以用作 meta-annotations 来创建具有属性覆盖的自定义组合注释。

6.4 JMS 改进

  • 现在可以在 class level 中指定@SendTo以共享 common 回复目标。

  • @JmsListener@JmsListeners现在可以用作 meta-annotations 来创建具有属性覆盖的自定义组合注释。

6.5 Web 改进

  • Built-in 支持HTTP HEAD 和 HTTP OPTIONS

  • @RequestMapping的新@GetMapping@PostMapping@PutMapping@DeleteMapping@PatchMapping组成注释。

  • 有关详细信息,请参阅组成 @RequestMapping 变体

  • web 范围的新@RequestScope@SessionScope@ApplicationScope组成注释。

  • 有关详细信息,请参阅请求范围Session 范围Applications 范围

  • 新的@RestControllerAdvice annotation 与@ControllerAdvice@ResponseBody语义相结合。

  • class level 现在支持@ResponseStatus并由所有方法继承。

  • 用于访问 session 属性的新@SessionAttribute annotation(请参阅)。

  • 用于访问请求属性的新@RequestAttribute annotation(请参阅)。

  • @ModelAttribute允许通过binding=false属性阻止数据 binding(请参阅参考)。

  • @PathVariable可以声明为可选(用于@ModelAttribute方法)。

  • 将错误和自定义 Throwables 一致地暴露给 MVC exception 处理程序。

  • HTTP 消息转换器中一致的字符集处理,包括 multipart 文本内容的 UTF-8 默认值。

  • 静态资源处理使用已配置的ContentNegotiationManager进行媒体类型确定。

  • RestTemplateAsyncRestTemplate支持通过DefaultUriTemplateHandler进行严格的 URI 变量编码。

  • AsyncRestTemplate支持请求拦截。

6.6 WebSocket 消息传递改进

  • 现在可以在 class-level 指定@SendTo@SendToUser以共享 common 目标。

6.7 测试改进

  • Spring TestContext Framework 中的 JUnit 支持现在需要 JUnit 4.12 或更高版本。

  • SpringJUnit4ClassRunner的新SpringRunner别名。

  • 现在可以在接口上声明与测试相关的注释 - 例如,用于使用基于 Java 8 的接口默认方法的测试接口。

  • 如果检测到默认的 XML files,Groovy 脚本或@Configuration classes,则现在可以完全省略@ContextConfiguration的空声明。

  • @Transactional测试方法不再需要public(e.g. ,在 TestNG 和 JUnit 5 中)。

  • @BeforeTransaction@AfterTransaction方法不再需要public,现在可以在基于 Java 8 的接口默认方法上声明。

  • Spring TestContext Framework 中的ApplicationContext缓存现在以默认最大大小 32 和最近最少使用的逐出 policy 为界。可以通过设置名为spring.test.context.cache.maxSize的 JVM 系统 property 或 Spring property 来配置最大大小。

  • 新的ContextCustomizer API 用于在 bean 定义加载到 context 之后但在 context 刷新之前自定义测试ApplicationContext。定制程序可以由第三方在全球注册,但需要实现自定义ContextLoader

  • @Sql@SqlGroup现在可以用作 meta-annotations 来创建具有属性覆盖的自定义组合注释。

  • ReflectionTestUtils现在在设置或获取字段时自动解包代理。

  • Server-side Spring MVC Test 支持对具有多个值的响应 headers 的期望。

  • Server-side Spring MVC Test 解析表单数据请求内容并填充请求参数。

  • Server-side Spring MVC Test 支持调用的处理程序方法的 mock-like 断言。

  • Client-side REST 测试支持允许指示预期请求的次数以及是否应忽略期望声明的顺序(请参阅第 15.6.3 节,“Client-Side REST 测试”)。

  • Client-side REST Test 支持对请求正文中的表单数据的期望。

6.8 支持新的 library 和服务器代

  • Hibernate ORM 5.2(仍支持 4.2/4.3 和 5.0/5.1,现在已弃用 3.6)

  • Hibernate Validator 5.3(最小值保持在 4.3)

  • Jackson 2.8(从 Spring 4.3 开始,最小值被提升到 Jackson 2.6)

  • OkHttp 3.x(仍然支持 OkHttp 2.x 并排)

  • Tomcat 8.5 以及 9.0 里程碑

  • Netty 4.1

  • Undertow 1.4

  • WildFly 10.1

此外,Spring Framework 4.3 在spring-core.jar中嵌入更新的 ASM 5.1,CGLIB 3.2.4 和 Objenesis 2.4.