移除不推荐的包和方法
所有可选的第三方依赖都已经升级到了最低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兼容的部署环境。
注意,Hibernate 4.3 是 JPA 2.1 的提供者,因此它只支持 Spring4。同样适用用于作为 Bean Validation 1.1 提供者的Hibernate Validator 5.0。这两个都不支持 Spring3.2。
核心容器改进
- 如 @bean 注释,就如同得到发现和处理 Java 8 默认方法一样,可以允许组合配置类与默认@bean 接口方法。
- 配置类现在可以声明 @import 作为常规组件类,允许引入的配置类和组件类进行混合。
- 配置类可以声明一个 @Order 值,用来得到相应的处理顺序(例如重写 bean 的名字),即使通过类路径扫描检测。
- @Resource 注入点支持 @Lazy 声明,类似于 @autowired, 用于接收用于请求目标 bean 的懒初始化代理。
- 现在的应用程序事件基础架构提供了一个基于注解的模型以及发布任意事件的能力。
6.1. 任何受管 bean 的公共方法使用 @EventListener 注解来消费事件。
6.2@TransactionalEventListener 提供事务绑定事件支持。 Spring Framework 4.2引入了一流的支持声明和查找注释属性的别名。新 @AliasFor 注解可用于声明一双别名属性在一个注释中或从一个属性在一个声明一个别名定义注解在元注释一个属性组成。
7.1 下面的注解已加了 @AliasFor 为了支持提供更有意义的 value 属性的别名:
@Cacheable, @CacheEvict, @ComponentScan, @ComponentScan.Filter, @Scope, @ManagedResource, @Payload, @SendToUser, @ContextConfiguration, @Sql, @TestExecutionListeners, @TestPropertySource, @Transactional, @ControllerAdvice, @CrossOrigin, @MatrixVariable, @RequestMapping, @RequestParam, @RequestPart, @ResponseStatus, @SessionAttributes, @ActionMapping, @RenderMapping, @EventListener, @TransactionalEventListener
例如,spring-test 的 @ContextConfiguration 现在声明如下:
public @interface ContextConfiguration
常规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
- 引入的 ScriptTemplateView 作为 JSR-223 的脚本化 web 视图机制为基础,关注 JavaScript 视图模板 Nashorn (JDK 8)。
测试改进
- 基于 JUnit 集成测试现在可以执行 JUnit 规则而不是SpringJUnit4ClassRunner。这允许基于 spring 的集成测试与运行
JUnit 的 Parameterized 或第三方 运行器 MockitoJUnitRunner 等。详见 Spring JUnit 规则 - Spring MVC Test 框架,现在支持第一类 HtmlUnit,包括集成 Selenium’s WebDriver,允许基于页面的 Web 应用测试而
无需部署到 Servlet 容器。详见 14.6.2, “HtmlUnit 集成” - AopTestUtils 是一个新的测试工具,允许开发者获得潜在的目标对象的引用隐藏在一个或多个 Spring 代理。“常见测试工具”
- 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 ,默认的实现可以替代自定义的缓存需求
10.DefaultTestContext, DefaultBootstrapContext, 和 DefaultCacheAwareContextLoaderDelegate 现在是公开的类,支持子
包,允许自定义扩展 - TestContextBootstrapper 现在负责构建 TestContext
在 Spring MVC Test 框架,MvcResult 详情可以被日志记录在 DEBUG 级别或者写入自定义的 OutputStream 或Writer。详见 log(), print(OutputStream), 和 MockMvcResultHandlers 的 print(Writer) 方法 - JDBC XML名称空间支持一个新的 的 database-name 属性,允许开发人员为嵌入式数据库设置独特的名字——例如,通过一个 SpEL 表达式或 前活动bean定义配置文件所影响的占位符属性嵌入式数据库现在可以自动分配一个唯一的名称,允许常用的测试数据库配置在不同的 ApplicationContext 的测试套件
中。
JMS 改进
Spring 4.1 引入了一个更简单的基础架构,使用 @JmsListener 注解bean 方法来注册 JMS 监听端点。XML 命名空间已经通过增强来支持这种新的方式( jms:annotation-driven ),它也可以完全通过Java配置( @EnableJms ,
JmsListenerContainerFactory )来配置架构。也可以使用JmsListenerConfigurer 注解来注册监听端点。
Spring 4.1 还调整了 JMS 的支持,使得你可以从 spring-messaging 在 Spring4.0 引入的抽象获益,即:
1. 消息监听端点可以有更为灵活的签名,并且可以从标准的消息注解获益,例如 @Payload 、 @Header 、 @Headers 和@ SendTo 注解。另外,也可以使用一个标准的消息,以代替 javax.jms.Message 作为方法参数。
2. 一个新的可用 JmsMessageOperations 接口和允许操作使用 Message 抽象的 JmsTemplate 。
缓存改进
Spring 4.1也大大提高了自己的缓存抽象:
1. 缓存可以在运行时使用 CacheResolver 解决。因此使用 value 参数定义的缓存名称不在是强制性的。
2. 更多的操作级自定义项:缓存解析器,缓存管理器,键值生成器
一个新的 @CacheConfig 类级别注解允许在类级别上共享常用配置,不需要启用任何缓存操作。
3. 使用 CacheErrorHandler 更好的处理缓存方法的异常