Spring5 是一个重要的版本,距离SpringFramework4差不多四年。在此期间,大多数增强都是在 SpringBoot 项目中完成的。在本文中,我们将很快了解到Spring5发行版中的一些令人兴奋的特性。
1. 基准升级
要构建和运行 Spring5 应用程序,你至少需要 J2EE7 和 JDK8。以前的 JDK 和 JavaEE 版本不再支持。 JavaEE7 包含:
Servlet 3.1
JMS 2.0
JPA 2.1
JAX-RS 2.0
Bean Validation 1.1
与 Java 基准类似,许多其他框架的基准也有变化。例如:
Hibernate 5
Jackson 2.6
EhCache 2.10
JUnit 5
Tiles 3
另外,请记下各种服务器最低支持版本。
Tomcat 8.5
Jetty 9.4
WildFly 10
Netty 4.1
Undertow 1.4
2. 兼容 JDK9 运行时
Spring5 发行版与 JDK9 发行日期非常接近。目标是让 Spring Framework5 在 JDK9 的 GA 之后正确运行。 Spring5 版本的候选版本已经在 classpath 和 modulepath 上支持 Java9 了。
GA版本中你可以期待良好的 JDK9 支持。
3. 使用 JDK8 特性
在 Spring4.3 之前,JDK基准版本是6。所以 Spring4 必须支持 Java6,7 和8,为了保持向后兼容性, Spring 框架没有适应 Java8 带来的许多新特性,比如 lambda 表达式。
Spring5 的基准版本为8,因此它使用了 Java8 和9的许多新特性。例如:
Spring 接口中的默认方法
基于 Java8 反射增强的内部代码改进
在框架代码中使用函数式编程 - lambda表达式 和 stream流
4. 函数式web框架
除了响应式功能之外,Spring5 还提供了一个函数式Web框架。它提供了使用函数式编程风格来定义端点的特性。 该框架引入了两个基本组件:HandlerFunction 和 RouterFunction。
HandlerFunction 表示处理接收到的请求并生成响应的函数。 RouterFunction 替代了 @RequestMapping 注解。它用于将接收到的请求路由到处理函数。例如:
RouterFunction route =
route(GET("/hello-world"),
request -> Response.ok().body(fromObject("Hello World")));
5.反应式编程模型
Spring 5 最令人兴奋的新特性是它的反应式编程模型。Spring 5 Framework 基于一种反应式基础而构建,而且是完全异步和非阻塞的。只需少量的线程,新的事件循环执行模型就可以垂直扩展。
该框架采用反应式流来提供在反应式组件中传播负压的机制。负压是一个确保来自多个生产者的数据不会让使用者不堪重负的概念。
Spring WebFlux 是 Spring 5 的反应式核心,它为开发人员提供了两种为 Spring Web 编程而设计的编程模型:一种基于注解的模型和 Functional Web Framework (WebFlux.fn)。
基于注解的模型是 Spring WebMVC 的现代替代方案,该模型基于反应式基础而构建,而 Functional Web Framework 是基于 @Controller 注解的编程模型的替代方案。这些模型都通过同一种反应式基础来运行,后者调整非阻塞 HTTP 来适应反应式流 API。
6. 对Kotlin的支持
Spring 5.0对Kotlin的支持如下。
• 使用Kotlin1.1.50或更高版本时,可以支持Null安全的API。
• 支持带有可选参数和默认值的Kotlin不可变类。
• 支持使用Kotlin DSL定义函数式Bean。
• 支持在WebFlux中使用有路由功能的Kotlin DSL。
• 利用Kotlin reified的类型参数来避免在各种API(如RestTemplate或WebFluxAPI)中明确指定用于序列化/反序列化的Class。
• 对@autowired、@Inject、@RequestParam和@RequestHeader等注解的Kotlin null安全支持,以确定注入点或处理程序方法参数是否合法。
• ScriptTemplateView中的Kotlin脚本支持Spring MVC和Spring WebFlux。
• 支持带有可选参数的Kotlin自动装配构造函数。
• Kotlin反射用于确定接口方法参数。
7. 额外库支持
Spring 5.0现在支持下面的库版本:
JackSon 2.6
EhCache 2.10 / 3.0 GA
Hibernate 5.0
JDBC 4.0
XmlUnit 2.x
OkHttp 3.x
Netty 4.1
停止维护的一些特性
在Api层面上,Spring5.0不在支持下面的包了:
beans.factory.access
jdbc.support.nativejdbc
spring-aspects模块的mock.staticmock
web.view.tiles2M. 现在Tiles 3是最低要求的版本
orm.hibernate3和orm.hibernate4.现在支持Hibernate5
8.不再支持如下库:
Portlet
Velocity
JasperReports
XMLBeans
JDO
Guava
如果你在当前的项目中使用到了上面提到的这些库,那么最好不要升级到Spring5的版本
9.测试改进
Spring 5.0测试改进如下。
•在Spring TestContext Framework中完全支持JUnit 5 Jupiter编程和扩展模型。
•SpringExtension:是JUnit Jupiter的多个扩展API的实现,它为SpringTestContext Framework的现有功能集提供完全支持。通过@ExtendWith(SpringExtension.class)启用此支持。
•@SpringJUnitConfig:一个复合注释,它将来自JUnit Jupiter的“@ExtendWith(SpringExtension.class)”与来自Spring TestContext Framework的“@ContextConfiguration”相结合。
•@SpringJUnitWebConfig:一个复合注释,它将来自JUnit Jupiter的“@ExtendWith(SpringExtension.class) ”与来自Spring TestContext Framework的“@ContextConfiguration”和“@WebAppConfiguration”相结合。
•@EnabledIf:如果提供的SpEL表达式或属性占位符的计算结果为true,则表示已启用带注释的测试类或测试方法。
•@DisabledIf:如果提供的SpEL表达式或属性占位符的计算结果为true,则表示禁用带注释的测试类或测试方法。
•支持Spring TestContext Framework执行并行测试。
•Spring TestContext Framework新增测试之前和测试之后的执行回调功能。
•TestExecutionListener API和TestContextManager新增beforeTestExecution()和afterTestExecution()回调。
•MockHttpServletRequest现在具有用于访问请求体的方法getContentAsByteArray()和getContentAsString()。
•如果在模拟请求中设置了字符编码,则Spring MVC Test中的print()和log()方法现在会打印请求主体。
•Spring MVC Test中的redirectedUrl()和forwardedUrl()方法现在支持具有可变参数扩展的URI模板。
•XMLUnit支持升级到XMLUnit 2.3。