Spring4新特性简述

Spring是一个java世界中极其流行的开源框架。Spring的初衷是降低企业级开发的复杂性,并试图通过POJO对象实现之前EJB这类重型框架才能实现的功能。Spring不仅仅对服务端开发有用,任何Java应用都可受益于Spring的简洁、易测试和低耦合等特性。

Spring框架中使用beansJavaBeans来表示应用程序中的组件,但这并不意味着该组件必须严格满足Java Bean的规范。
Spring做了很多事情,但是归根到底是一些基本的思路,而所有这些思路最终都导向Spring的使命:简化Java开发
Spring通过下列四种策略来简化Java开发:
基于POJO的轻量级、最小侵入式开发;
通过依赖注入和面向接口编程实现松耦合;
通过面向切面编程和惯例实现声明式编程;
通过面向切面编程和模板消除样板式代码
按照功能划分,这些模块可以分成六组,如下图所示:

这些模块几乎可以满足所有企业级应用开发的需求,但是开发人员并不需要完全使用Spring的这些模块,可以自由选择符合项目需求的第三方模块——Spring为一些第三方模块提供了交互接口。
CORE SPRING CONTAINER
Spring框架的核心模块,其他所有模块都基于该模块构建。Spring容器负责管理Spring应用中bean的创建、配置和管理。在这模块中有Spring bean factory,该接口提供了最基本的依赖注入(DI)功能;基于bean factory,该模块提供了集中Spring应用上下文的实现,可以供开发人员选择。
除了bean factory和application context,该模块还支持其他企业级服务,例如email、JNDI access、EJB integration和scheduling。
SPRING's AOP MODULE
Spring框架通过AOP模块提供面向切面编程的能力。通过AOP模块,一些系统层面的需求(事务、安全)可以与它们真正要作用到的模块相互解耦合。
DATA ACCESS AND INTEGRATION
Spring的JDBC和data-access object模块将数据库操作的一些样板式代码封装起来,免去了开发人员的很多工作量。这个模块还对数据库层的异常进行了封装,并向上提供含义更丰富的异常信息。
Spring并未实现自己的ORM框架,但是它提供了跟其他几个ORM框架整合的能力,例如Hibernate、Mybatis、Java Persistence AP等等,而且这些ORM框架都支持使用Spring提供的事务管理模块。
WEB AND REMOTING
Spring提供了自己的 WEB开发框架——Spring MVC,除此之外,这个模块还提供远程调用支持:Remote Method Invocation(RMI)、Hessian、Burlap和JAX-WS。
INSTRUMENTATION
不常使用
TESTING
可以与常用的JUNIT、Mockito、Spock等测试框架整合使用。
spring4新特性
spring4.x不仅支持Java8,而且向下兼容到JavaSE6/JavaEE6,并移出了相关废弃类,新添加如Java8的支持、Groovy式Bean定义DSL、对核心容器进行增强、对Web框架的增强、Websocket模块的实现、测试的增强等。
这里简单列举下实际中用得多的地方:
支持map,list注入

@Autowired
private Map<String,MyService> map;
@Autowired
private List<MyService> list;

对于map,会将所有类型为MyService的bean以bean的name为key注入到map
对于list,会注入所有MyService类型的bean
基于CGLIB的类代理不再要求类必须有空参构造器了:
这是一个很好的特性,使用构造器注入有很多好处,比如可以只在创建Bean时注入依赖,然后就不变了,如果使用setter注入,是允许别人改的.
WEB开发增强
为了方便Rest开发,通过新的@RestController指定在控制器上,这样就不需要在每个@RequestMapping方法上加@ResponseBody了。而且添加了一个AsyncRestTemplate,支持REST客户端的异步无阻塞支持.

 

@RestController
public class UserController {
  private UserService userService;

  @Autowired
  public UserController(UserService userService) {
      this.userService = userService;
  }
  @RequestMapping("/test")
  public User view() {
      User user = new User();
      user.setId(1L);
      user.setName("haha");
      return user;
  }
}

提供AsyncRestTemplate用于客户端非阻塞异步支持。
服务器端

 

@RestController
public class UserController {
    private UserService userService;
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
    @RequestMapping("/api")
    public Callable api() {
        System.out.println("=====hello");
        return new Callable() {
            @Override
            public User call() throws Exception {
                Thread.sleep(10L *1000);//暂停两秒
                User user =new User();
                user.setId(1L);
                user.setName("haha");
                return user;
            }
        };
    }
}

客户端

 

  public static void main(String[] args) {
        AsyncRestTemplate template =new AsyncRestTemplate();
//调用完后立即返回(没有阻塞)
        Listenable<Future> future = template.getForEntity("http://localhost:9080/spring4/api", User.class);
//设置异步回调
        future.addCallback(new ListenableFutureCallback > ()  {
            @Override
            public void onSuccess (ResponseEntity result) {
                System.out.println("======client get result : " + result.getBody());
            }
            @Override
            public void onFailure (Throwable t) {
                System.out.println("======client failure : " + t);
            }
        });
        System.out.println("==no wait");
    }

此处使用Future来完成非阻塞,这样的话我们也需要给它一个回调接口来拿结果; Future和Callable是一对,一个消费结果,一个产生结果。调用完模板后会立即返回,不会阻塞;有结果时会调用其回调.
Bean Validate新特性
支持跨参数验证(比如密码和确认密码的验证)和支持在消息中使用EL表达式,其他的还有如方法参数/返回值验证、CDI和依赖注入、分组转换等。
其他的一些改进:
1、核心部分基本上无变化,提供了DirectFieldAccessor用于直接字段访问、yaml配置、SpEL的字节码编译化、BackOff退避算法的基本实现、Base64Utils、SmartInitializingSingleton等;
2、在任务调度和事件机制上加入了异常处理部分;
3、cache部分加入jcache的集成、类级别的@CacheConfig的支持、CacheResolver;
4、mvc部分提供了一些视图解析器的mvc标签实现简化配置、提供了GroovyWebApplicationContext用于Groovy web集成、提供了Gson、protobuf的HttpMessageConverter、静态资源处理方面添加了resolver和transformer、提供了对groovy-templates模板的支持、JSONP的支持、对Jackson的@JsonView的支持等;
5、提供了页面自动化测试框架Spring MVC Test HtmlUnit;
6、test部分提供了更便利的@sql标签来执行测试脚本的初始化、MockRestServiceServer对AyncRestTemplate支持、MockMvcConfigurer来全局配置MockMvc;
7、提供了对Java8 Optional的支持(ObjectToOptionalConverter实现;可以在MVC中如@RequestParam等注解的绑定)、从Spring 4.1起Ehcache支持需要EhCache 2.5或更高版本、兼容Quartz 2.1.4、支持javax.annotation.Priority(等价于@Order)、JMS API的增强、SpringJUnit4ClassRunner需要 JUnit 4.9或更高版本支持。
总体来说没有大的变化,只是一些增强,因此我们升级是很容易的。

来源:https://www.jianshu.com/p/95bf60d34352

---------------------------

Spring 4.0 新功能和增强

Spring 框架第一个版本发布于 2004 年,自发布以来已历经三个主要版本更新: Spring 2.0 提供了 XML 命名空间和 AspectJ 支持;Spring 2.5 增加了注释驱动(annotation-driven)的配置支持; Spring 3.0增加了对 Java 5+ 版本的支持和 @Configuration 模型。

Spring 4.0 是最新的主要版本,并且首次完全支持 Java 8 的特性。你仍然可以使用老版本的 Java,但是最低版本的要求已经提高到 Java SE 6。我们也借主要版本更新的机会删除了许多过时的类和方法。

你可以在Spring Framework GitHub Wiki上查看 升级 Spring 4.0 的迁移指南。

改进的入门体验

新的 spring.io 网站提供了一整个系列的 "入门指南" 帮助你学习 Spring。你可以本文档的 1. Getting Started with Spring 一节阅读更多的入门指南。新网站还提供了Spring 之下其他额外项目的一个全面的概述。

如果你是一个 Maven 用户,你可能会对 BOM 这个有用的 POM 文件感兴趣, 这个文件已经与每个 Spring 的发布版发布。

移除不推荐的包和方法

所有过时的包和许多过时的类和方法已经从Spring4中移除。如果你从之前的发布版升级Spring,你需要保证已经修复了所有使用过时的API方法。

查看完整的变化: API差异报告。

请注意,所有可选的第三方依赖都已经升级到了最低2010/2011(例如Spring4 通常只支持 2010 年的最新或者现在的最新发布版本):尤其是 Hibernate 3.6+、EhCache 2.1+、Quartz 1.8+、Groovy 1.8+、Joda-Time 2.0+。但是有一个例外,Spring4依赖最近的Hibernate Validator 4.3+,现在对Jackson的支持集中在2.0+版本 (Spring3.2支持的Jackson 1.8/1.9,现在已经过时)。

Java 8(以及6和7)支持

Spring4 支持 Java8 的一些特性。你可以在 Spring 的回调接口中使用 lambda 表达式 和 方法引用。支持java.time (JSR-310)的值类型和一些改进过的注解,例如 @Repeatable。你还可以使用 Java8 的参数名称发现机制(基于-parameters编译器标志)。

Spring 仍然兼容老版本的 Java 和 JDK:Java SE 6(具体来说,支持JDK6 update 18 )以上版本,我们建议新的基于 Spring4 的项目使用Java7或Java8。

Java EE 6 和 7支持

Java EE 6 或以上版本是 Spring4 的底线,与 JPA2.0 和 Servlet3.0规范有着特殊的意义。为了保持与 Google App Engine 和旧的应用程序服务器兼容,Spring4 可以部署在 Servlet2.5 运行环境。但是我们强烈的建议您在 Spring 测试和模拟测试的开发环境中使用 Servlet3.0+。

如果你是WebSphere 7的用户,一定要安装JPA2.0功能包。在WebLogic 10.3.4或更高版本,安装附带的JPA2.0补丁。这样就可以将这两种服务器变成Spring4兼容的部署环境。

从长远的观点来看,Spring4.0 现在支持 Java EE 7 级别的适用性规范:尤其是 JMS 2.0, JTA 1.2, JPA 2.1, Bean Validation 1.1 和JSR-236 并发工具类。像往常一样,支持的重点是独立的使用这些规范。例如在 Tomcat 或者独立环境中。但是,当把 Spring 应用部署到 Java EE 7 服务器时它同样适用。

注意,Hibernate 4.3 是 JPA 2.1 的提供者,因此它只支持 Spring4。同样适用用于作为 Bean Validation 1.1 提供者的 Hibernate Validator 5.0。这两个都不支持 Spring3.2。

Groovy Bean Definition DSL

Spring4.0 支持使用 Groovy DSL 来进行外部的 bean 定义配置。这在概念上类似于使用 XML 的 bean 定义,但是支持更简洁的语法。使用Groovy 还允许您轻松地将 bean 定义直接嵌入到引导代码中。例如:

  1. def reader = new GroovyBeanDefinitionReader(myApplicationContext)
  2. reader.beans {
  3. dataSource(BasicDataSource) {
  4. driverClassName = "org.hsqldb.jdbcDriver"
  5. url = "jdbc:hsqldb:mem:grailsDB"
  6. username = "sa"
  7. password = ""
  8. settings = [mynew:"setting"]
  9. }
  10. sessionFactory(SessionFactory) {
  11. dataSource = dataSource
  12. }
  13. myService(MyService) {
  14. nestedBean = { AnotherBean bean ->
  15. dataSource = dataSource
  16. }
  17. }
  18. }

有关更多信息,请参阅 GroovyBeanDefinitionReader javadocs

核心容器改进

有几种对核心容器的常规改进:

  • Spring 现在注入 Bean 的时候把 泛型类型当成一种形式的限定符。例如:如果你使用S pring DataRepository 你可以方便的插入特定的实现:@Autowired Repository<Customer> customerRepository
  • 如果你使用 Spring 的元注解支持,你现在可以开发自定义注解来公开源注解的特定属性。
  • 当自动装配到lists和arrays时,Beans 现* 在可以被 排序 了。支持@Order注解和Ordered接口两种方式。 @Lazy注解现在可以用在注入点以及@Bean定义上。
  • 引入@Description注解,开发人员可以使用基于Java 方式的配置。
  • 根据条件筛选 Beans的广义模型通过@Conditional注解加入。这和@Profile支持的类似,但是允许以编程式开发用户定义的策略。
  • 基于CGLIB的代理类不在需要默认的构造方法。这个支持是由 objenesis库提供。这个库重新打包到 Spring 框架中,作为Spring框架的一部分发布。通过这个策略,针对代理实例被调用没有构造可言了。
  • 框架现在支持管理时区。例如LocaleContext

常规Web改进

现在仍然可以部署到 Servlet 2.5 服务器,但是 Spring4.0 现在主要集中在 Servlet 3.0+ 环境。如果你使用Spring MVC 测试框架,你需要将 Servlet 3.0 兼容的 JAR 包放到 测试的 classpath 下。

除了稍后会提到的 WebSocket 支持外,下面的常规改进已经加入到Spring 的 Web 模块:

  • 你可以在Spring MVC应用中使用新的@RestController注解,不在需要给@RequestMapping的方法添加@ResponseBody注解。
  • AsyncRestTemplate 类已被添加进来,当开发 REST 客户端时,允许非阻塞异步支持。
  • 当开发 Spring MVC 应用时,Spring现在提供了全面的时区支持 。

WebSocket, SockJS, 和 STOMP 消息

一个新的 spring-websocket 模块提供了全面的基于 WebSocket 和在Web 应用的客户端和服务器之间双向通信的支持。它和 Java WebSocket API JSR-356 兼容,此外还提供了当浏览器不支持 WebSocket 协议时 (如 Internet Explorer < 10)的基于SockJS 的备用选项(如 WebSocket emulation)。

一个新的spring-messaging模块添加了支持 STOMP 作为 WebSocket 子协议用于在应用中使用注解编程模型路由和处理从 WebSocket 客户端发送的 STOMP 消息。由于@Controller现在可以同时包含@RequestMapping@MessageMapping方法用于处理 HTTP 请求和来自 WebSocket 连接客户端发送的消息。新的spring-messaging模块还包含了来自以前 Spring 集成项目的关键抽象,例如MessageMessageChannelMessageHandler和其他作为基于消息传递的应用程序的基础。

欲知详情以及较全面的介绍,请参见Chapter 20, WebSocket 支持一节。

测试改进

除了精简spring-test模块中过时的代码外,Spring 4 还引入了几个用于单元测试和集成测试的新功能。

  • 几乎 spring-test模块中所有的注解(例如:@ContextConfiguration@WebAppConfiguration@ContextHierarchy@ActiveProfiles等等)现在可以用作元注解来创建自定义的 composed annotations 并且可以减少测试套件的配置。
  • 现在可以以编程方式解决Bean定义配置文件的激活。只需要实现一个自定义的ActiveProfilesResolver,并且通过@ActiveProfiles的resolver属性注册。
  • 新的 SocketUtils 类被引入到了spring-core模块。这个类可以使你能够扫描本地主机的空闲的 TCP 和 UDP 服务端口。这个功能不是专门用在测试的,但是可以证明在你使用 Socket 写集成测试的时候非常有用。例如测试内存中启动的SMTP服务器,FTP服务器,Servlet容器等。
  • 从 Spring 4.0 开始,org.springframework.mock.web包中的一套mock是基于Servlet 3.0 API。此外,一些Servlet API mocks(例如:MockHttpServletRequestMockServletContext等等)已经有一些小的改进更新,提高了可配置性。

JMS 改进

Spring 4.1 引入了一个更简单的基础架构,使用 @JmsListener注解bean 方法来注册 JMS 监听端点。XML 命名空间已经通过增强来支持这种新的方式(jms:annotation-driven),它也可以完全通过Java配置(@EnableJmsJmsListenerContainerFactory)来配置架构。也可以使用 JmsListenerConfigurer注解来注册监听端点。

Spring 4.1 还调整了 JMS 的支持,使得你可以从spring-messaging在 Spring4.0 引入的抽象获益,即:

  • 消息监听端点可以有更为灵活的签名,并且可以从标准的消息注解获益,例如@Payload@Header@Headers和@SendTo注解。另外,也可以使用一个标准的消息,以代替javax.jms.Message作为方法参数。
  • 一个新的可用 JmsMessageOperations接口和允许操作使用Message抽象的JmsTemplate

最后,Spring 4.1提供了其他各种各样的改进:

  • JmsTemplate中的同步请求-答复操作支持
  • 监听器的优先权可以指定每个<jms:listener/>元素
  • 消息侦听器容器恢复选项可以通过使用 BackOff 实现进行配置
  • JMS 2.0消费者支持共享

缓存改进

Spring 4.1 支持JCache (JSR-107)注解使用Spring的现有缓存配置和基础结构的抽象;使用标准注解不需要任何更改。

Spring 4.1也大大提高了自己的缓存抽象:

  • 缓存可以在运行时使用CacheResolver解决。因此使用value参数定义的缓存名称不在是强制性的。
  • 更多的操作级自定义项:缓存解析器,缓存管理器,键值生成器
  • 一个新的@CacheConfig类级别注解允许在类级别上共享常用配置,不需要启用任何缓存操作。
  • 使用CacheErrorHandler更好的处理缓存方法的异常

Spring 4.1为了在CacheInterface添加一个新的putIfAbsent方法也做了重大的更改。

Web 改进

  • 现有的基于ResourceHttpRequestHandler的资源处理已经扩展了新的抽象ResourceResolverResourceTransformerResourceUrlProvider。一些内置的实现提供了版本控制资源的 URL(有效的 HTTP 缓存),定位 gzip 压缩的资源,产生 HTML5 AppCache清单,以及更多的支持。参见第17.16.7,“Serving of Resources(服务资源)”。
  • JDK 1.8 的java.util.Optional现在支持@RequestParam@RequestHeader@MatrixVariable控制器方法的参数。
  • ListenableFuture支持作为返回值替代DeferredResult所在的底层服务(或者调用AsyncRestTemplate)已经返回ListenableFuture
  • @ModelAttribute方法现在依照相互依存关系的顺序调用。见SPR-6299。
  • Jackson的@JsonView被直接支撑在@ResponseBodyResponseEntity控制器方法用于序列化不同的细节对于相同的 POJO(如摘要与细节页)。同时通过添加序列化视图类型作为模型属性的特殊键来支持基于视图的渲染。见Jackson Serialization View Support(Jackson序列化视图支持)
  • Jackson 现在支持 JSONP ,见 Jackson JSONP Support
  • 一个新的生命周期选项可用于在控制方法返回后,响应被写入之前拦截@ResponseBodyResponseEntity方法。要充分利用声明@ControllerAdvice bean 实现ResponseBodyAdvice。为@JsonView和 JSONP 的内置支持利用这一优势。参见第17.4.1,“使用HandlerInterceptor 拦截请求”。
  • 有三个新的HttpMessageConverter选项:
    • GSON - 比 Jackson 更轻量级的封装;已经被使用在 Spring Android
    • Google Protocol Buffers - 高效和有效的企业内部跨业务的数据通信协议,但也可以用于浏览器的 JSON 和 XML 的扩展
    • Jackson 基于 XML 序列化,现在通过 jackson-dataformat-xml 扩展得到了支持。如果 jackson-dataformat-xml 在 classpath, 默认情况下使用@EnableWebMvc<mvc:annotation-driven/>,这是,而不是JAXB2。
  • 如 JSP 等视图现在可以通过名称参照控制器映射建立链接控制器。默认名称分配给每一个@RequestMapping。例如FooController的方法与handleFoo被命名为“FC#handleFoo”。命名策略是可插拔的。另外,也可以通过其名称属性明确命名的@RequestMapping。在Spring JSP标签库的新mvcUrl功能使这个简单的JSP页面中使用。参见第17.7.2,“Building URIs to Controllers and methods from views”
  • ResponseEntity提供了一种 builder 风格的 API 来指导控制器向服务器端的响应的展示,例如,ResponseEntity.ok()。
  • RequestEntity 是一种新型的,提供了一个 builder 风格的 API 来引导客户端的 REST 响应 HTTP 请求的展示。
  • MVC 的 Java 配置和 XML 命名空间:
    • 视图解析器现在可以配置包括内容协商的支持,请参见17.16.6“视图解析”。
    • 视图控制器现在已经内置支持重定向和设置响应状态。应用程序可以使用它来配置重定向的URL,404 视图的响应,发送“no content”的响应,等等。有些用例这里列出。
    • 现在内置路径匹配的自定义。参见第17.16.9,“路径匹配”。
  • Groovy 的标记模板支持(基于Groovy的2.3)。见GroovyMarkupConfigurer 和各自的ViewResolver和“视图”的实现。

WebSocket STOMP 消息 改进

  • SockJS(Java)客户端支持.查看 SockJsClient 和在相同包下的其他类.
  • 发布新的应用上下文实践 SessionSubscribeEvent 和 SessionUnsubscribeEvent, 用于STOMP客户端的订阅和取消订阅.
  • 新的"websocket"级别.查看 Section 25.4.14, “WebSocket Scope”.
  • @SendToUser 仅仅靠一个会话就可以命中, 而不一定需要一个授权的用户.
  • @MessageMapping 方法使用 . 来代替 / 作为目录分隔符。查看 SPR-11660.。
  • STOMP/WebSocket 监听消息的收集和记录。查看25.4.16, “Runtime Monitoring”.。
  • 显著优化和改善在调试模式下依然保持日志的可读性和简洁性。
  • 优化消息创建,包含对临时消息可变性的支持和避免自动消息ID和时间戳的创建。查看MessageHeaderAccessor 的java文档。
  • 在WebSocket会话建立之后的1分钟没有任何活动,则关闭STOMP/WebSocket连接。

测试改进

  • Groovy脚本现在能使用ApplicationContext配置,在TestContext框架中整合测试。the section called “Context configuration with Groovy scripts”
  • 现在通过新的TestTransaction接口,使用编程化来开始结束测试管理事务。the section called “Programmatic transaction management”
  • 现在SQL脚本的执行可以通过SqlSqlConfig注解申明在每一个类和方法中。the section called “Executing SQL scripts”
  • 测试属性值可以通过配置@TestPropertySource注解来自动覆盖系统和应用的属性值。the section called “Context configuration with test property sources”。
  • 默认的TestExecutionListeners现在可以自动被发现。the section called “Automatic discovery of default TestExecutionListeners” 。
  • 自定义的TestExecutionListeners现在可以通过默认的监听器自动合并。the section called “Merging TestExecutionListeners”。
  • 在TestContext框架中的测试事务方面的文档已经通过更多解释和其他事例得到改善。the section called “Transaction management”。
  • MockServletContextMockHttpServletRequest和其他servlet接口mocks等诸多改善。
  • AssertThrows重构后,Throwable代替Exception
  • Spring MVC测试中,使用JSONPath选项返回JSON格式可以使用JSON Assert来断言,非常像之前的XML和XMLUnit。
  • MockMvcBuilder现在可以在MockMvcConfigurer的帮助下创建。MockMvcConfigurer的加入使得Spring Security的设置更加简单,同时使用于任何第三方的普通封装设置或则仅仅在本项目中。
  • MockRestServiceServer现在支持AsyncRestTemplate作为客户端测试。
  • 发布新的应用上下文实践SessionSubscribeEvent和 SessionUnsubscribeEvent,用于STOMP客户端的订阅和取消订阅.
  • 新的"websocket"级别.查看[Section 21.4.13, “WebSocket Scope”.](http://docs.spring.io/spring/docs/current/spring-framework-

核心容器改进

  • 如 @bean 注释,就如同得到发现和处理 Java 8 默认方法一样,可以允许组合配置类与默认@bean 接口方法。
  • 配置类现在可以声明 @import 作为常规组件类,允许引入的配置类和组件类进行混合。
  • 配置类可以声明一个 @Order 值,用来得到相应的处理顺序(例如重写 bean 的名字),即使通过类路径扫描检测。
  • @Resource 注入点支持 @Lazy 声明,类似于 @autowired, 用于接收用于请求目标 bean 的懒初始化代理。
  • 现在的应用程序事件基础架构提供了一个基于注解的模型以及发布任意事件的能力。
    • 任何受管 bean 的公共方法使用 @EventListener 注解来消费事件。
    • @TransactionalEventListener 提供事务绑定事件支持。
  • Spring Framework 4.2引入了一流的支持声明和查找注释属性的别名。新 @AliasFor 注解可用于声明一双别名属性在一个注释中或从一个属性在一个声明一个别名定义注解在元注释一个属性组成。
    • 下面的注解已加了 @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
    • 例如,spring-test 的 @ContextConfiguration 现在声明如下:
  1. public@interface ContextConfiguration {
  2. @AliasFor("locations")
  3. String[] value() default {};
  4. @AliasFor("value")
  5. String[] locations() default {};
  6. // ...
  7. }
  1. * 同样, 组合注解(composed annotations)从元注解覆盖的属性,现在可以使用 @AliasFor 进行细粒度控制哪些属性是覆盖在一个注释的层次结构。事实上,现在可以声明一个别名给元注释的 value 属性。
  2. * 例如,开发一个组合注解用于一个自定义的属性的覆盖
  1. @ContextConfigurationpublic@interface MyTestConfig {
  2. @AliasFor(annotation = ContextConfiguration.class, attribute = "value")
  3. String[] xmlFiles();
  4. // ...
  5. }
* 
  1. 见 [Spring Annotation Programming Model](http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#annotation-programming-model)
  • 许多改进Spring的搜索算法用于寻找元注解。例如,局部声明组合注解现在喜欢继承注解。
  • 从元注解覆盖属性的组合注解,可以被发现在接口和 abstract, bridge, & interface 方法就像在类,标准方法,构造函数,和字段。
  • Map 表示的注解属性(和 AnnotationAttributes 实例)可以 synthesized (合成,即转换)成一个注解。
  • 基于字段的数据绑定的特点(DirectFieldAccessor)与当前的基于属性的数据绑定关联(BeanWrapper)。特别是,基于字段的绑定现在支持集合,数组和 Map 的导航。
  • DefaultConversionService 现在提供开箱即用的转化器给 Stream, Charset, Currency, 和 TimeZone. 这些转换器可以独立的添加到任何 ConversionService
  • DefaultFormattingConversionService 提供开箱即用的支持 JSR-354 的 Money & Currency 类型 (前提是 'javax.money' API 出现在 classpath): 这些被命名为 MonetaryAmount 和 CurrencyUnit。支持使用 @NumberFormat
  • @NumberFormat 现在作为元注解使用
  • JavaMailSenderImpl 中新的 testConnection() 方法用于检查与服务器的连接
  • ScheduledTaskRegistrar 用于暴露调度的任务
  • Apache commons-pool2 现在支持用于 AOP CommonsPool2TargetSource 的池化
  • 引入 StandardScriptFactory 作为脚本化 bean 的 JSR-223 的基本机制,通过 XML 中的 lang:std 元素暴露。支持如 JavaScript 和 JRuby。(注意:JRubyScriptFactory 和 lang:jruby现在不推荐使用了 , 推荐用 JSR-223)

数据访问改进

  • javax.transaction.Transactional 现在可以通过 AspectJ 支持
  • SimpleJdbcCallOperations 现在支持命名绑定
  • 完全支持 Hibernate ORM 5.0: 作为 JPA 供应商 (自动适配)和原生的 API 一样 (在新的 org.springframework.orm.hibernate5 包中涵盖了该内容)
  • 嵌入式数据库可以自动关联唯一名字,并且 <jdbc:embedded-database> 支持新的 database-name 属性。见下面“测试改进”内容

JMS 改进

  • autoStartup 属性可以通过 JmsListenerContainerFactory 进行控制
  • 应答类型 Destination 可以配置在每个监听器容器
  • @SendTo 的值可以用 SpEL 表达式
  • 响应目的地可以通过 JmsResponse 在运行时计算
  • @JmsListener 是可以可以重复的注解用于声明多个 JMS 容器在相同的方法上 (若你还没有用上 Java8 请使用新引入的 @JmsListeners)。

Web 改进

  • 支持 HTTP Streaming 和 Server-Sent Events , se见 “HTTP Streaming”
  • 内建支持 CORS ,包括全局 (MVC Java 配置和 XML 命名空间) 和本地 (如 @CrossOrigin) 配置。见 26 章, CORS 支持
  • HTTP 缓存升级
    • 新的 CacheControl 构建器; 插入 ResponseEntity, WebContentGenerator, ResourceHttpRequestHandler
    • 改进的 ETag/Last-Modified 在 WebRequest 中支持
  • 自定义映射注解使用 @RequestMapping 作为 元数据注解
  • AbstractHandlerMethodMapping 中的 public 方法用于运行时注册和注销请求映射
  • AbstractDispatcherServletInitializer 中的 Protected createDispatcherServlet 方法用来进一步自定义 DispatcherServlet 实例
  • HandlerMethod 作为 @ExceptionHandler方法的方法参数,特别是方便 @ControllerAdvice 组件
  • java.util.concurrent.CompletableFuture 作为 @Controller 方法返回值类型
  • 字节范围(Byte-range)的请求支持在 HttpHeaders,用于静态资源
  • @ResponseStatus 发现嵌套异常。
  • 在 RestTemplate 中的 UriTemplateHandler 扩展端点
    • DefaultUriTemplateHandler 暴露 baseUrl 属性和路径段的编码选项
    • 扩展端点可以使用插入任何 URI 模板库
  • OkHTTP 与 RestTemplate 集成
  • 自定义 baseUrl 在 MvcUriComponentsBuilder 选择方法。
  • 序列化/反序列化异常消息现在记录为 WARN 级别
  • 默认的 JSON 前缀改变了从{}&&改为更安全的)]}’,
  • 新的 RequestBodyAdvice 扩展点和内置的实现支持 Jackson 的 在 @RequestBody 的 @JsonView
  • 当使用 GSON 或 Jackson 2.6 +,处理程序方法的返回类型是用于提高参数化类型的序列化,比如List<Foo>
  • 引入的 ScriptTemplateView 作为 JSR-223 的脚本化 web 视图机制为基础,关注 JavaScript 视图模板 Nashorn (JDK 8)。

WebSocket 消息改进

  • 暴露展示信息关于用户的连接和订阅:
    • 新 SimpUserRegistry 公开为一个名为“userRegistry”的bean。
    • 共享在服务器集群的展示信息(见代理中继配置选项)
  • 解决用户目的地在集群的服务器(见代理中继配置选项)。
  • StompSubProtocolErrorHandler 扩展端点用来自定义和控制 STOMP ERROR 帧给用户
  • 全局 @MessageExceptionHandler 方法通过 @ControllerAdvice 组件
  • 心跳和 SpEL 表达式'selector'头用 SimpleBrokerMessageHandler 订阅
  • STOMP 客户端使用TCP 和 WebSocket; 见 25.4.13, “STOMP 客户端”
  • @SendTo 和 @SendToUser 可以包含目标变量的占位符。 Jackson 的 @JsonView 支持 @MessageMapping 和 @SubscribeMapping 方法返回值
  • ListenableFuture 和 CompletableFuture 是从 @MessageMapping 和 @SubscribeMapping 方法返回类型值
  • MarshallingMessageConverter 用于 XML 有效载荷

测试改进

  • 基于 JUnit 集成测试现在可以执行 JUnit 规则而不是SpringJUnit4ClassRunner。这允许基于 spring 的集成测试与运行JUnit 的 Parameterized 或第三方 运行器 MockitoJUnitRunner 等。详见 Spring JUnit 规则
  • Spring MVC Test 框架,现在支持第一类 HtmlUnit,包括集成 Selenium’s WebDriver,允许基于页面的 Web 应用测试而无需部署到 Servlet 容器。详见 14.6.2, “HtmlUnit 集成”
  • AopTestUtils 是一个新的测试工具,允许开发者获得潜在的目标对象的引用隐藏在一个或多个 Spring 代理。详见 13.2.1, “常见测试工具”
  • ReflectionTestUtils 现在支持 setting 和 getting static 字段,包括常量
  • bean 定义归档文件的原始顺序,通过 @ActiveProfiles 声明,现在保留为了支持用例,如 Spring 的 ConfigFileApplicationListener 引导加载配置文件基于活动归档文件的名称。
  • @DirtiesContext 支持新 BEFORE_METHOD BEFORE_CLASS,BEFORE_EACH_TEST_METHOD 模式,用于测试之前关闭ApplicationContext——例如,如果一些烦人的(即,有待确定)测试在一个大型测试套件的 ApplicationContext 的原始配置已经损坏。
  • @Commit 是新的注解直接可以用来代替 @Rollback(false)
  • @Rollback 用来配置类级别的默认回滚语义
    • 因此,现在 @TransactionConfiguration 弃用,在后续版本将被删除。
  • @Sql 现在支持内联 SQL 语句的执行通过一个新的 statements 属性
  • ContextCache 用于缓存测试之间的 ApplicationContext,而现在这是一个公开的 API ,默认的实现可以替代自定义的缓存需求
  • DefaultTestContext, DefaultBootstrapContext, 和 DefaultCacheAwareContextLoaderDelegate 现在是公开的类,支持子包,允许自定义扩展
  • TestContextBootstrapper 现在负责构建 TestContext
  • 在 Spring MVC Test 框架,MvcResult 详情可以被日志记录在 DEBUG 级别或者写入自定义的 OutputStream 或 Writer。详见 log(), print(OutputStream), 和 MockMvcResultHandlers 的 print(Writer) 方法
  • JDBC XML名称空间支持一个新的 <jdbc:embedded-database> 的 database-name 属性,允许开发人员为嵌入式数据库设置独特的名字——例如,通过一个 SpEL 表达式或 前活动bean定义配置文件所影响的占位符属性
  • 嵌入式数据库现在可以自动分配一个唯一的名称,允许常用的测试数据库配置在不同的 ApplicationContext 的测试套件中。 参见18.8.6“给嵌入式数据库生成惟一名称”的细节。

 

来源:https://blog.csdn.net/z1049186181/article/details/51446643