Spring Framework 5.0是在Spring Framework 4.0之后将近四年内一次重大的升级。 在这个时间框架内,主要的发展之一就是Spring Boot项目的演变。

Spring Framework 5.0的最大特点之一是响应式编程(Reactive Programming)。 响应式编程核心功能和对响应式endpoints的支持可通过Spring Framework 5.0中获得。 重要变动如下列表所示:

  • 常规升级
  • 对JDK 9运行时兼容性
  • 在Spring Framework代码中使用JDK 8特性
  • 响应式编程支持
  • 函数式Web框架
  • Jigsaw的Java模块化
  • 对Kotlin支持
  • 舍弃的特性

1. 常规升级

Spring Framework 5.0遵守JDK 8和Java EE 7规范。 基本上,这意味着以前的JDK和Java EE版本不再受支持了。

Spring Framework 5.0的一些重要基于Java EE 7规范如下所示:

  • 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+ (for web reactive programming with Spring Web Flux)
  • Undertow 1.4+ (for web reactive programming with Spring Web Flux)

使用早期版本的任何前述规范/框架的应用程序需要在使用Spring Framework 5.0之前至少升级到上边列出的版本。


2. 对JDK 9运行时兼容性

JDK 9预计将于2017年年中发布。Spring Framework 5.0期望与JDK 9运行时保持兼容性。

Tips

关于Java 9的发布时间,定在9月末,关于更多关于Java 9 的知识,可以访问:Java 9揭秘


3. 在Spring Framework代码中使用JDK 8特性

Spring Framework 4.x的基准版本是Java SE 6。这意味着它支持Java 6,7和8。必须支持Java SE 6和7对Spring Framework代码的约束。 框架代码不能使用Java 8中的任何新功能。所以,当世界其他地方升级到Java 8时,Spring Framework中的代码(至少主要部分)仅限于使用早期版本的Java。

使用Spring Framework 5.0,基准版本是Java 8。Spring Framework代码现在已升级为使用Java 8中的新特性。会改进更可读和更有效的框架代码。 使用的一些Java 8特性如下:

  • 核心Spring接口中的Java 8 static 方法
  • 基于Java 8反射增强的内部代码改进
  • 在框架代码中使用函数式编程——lambdas表达式和stream流

4. 响应式编程支持

响应式编程是Spring Framework 5.0最重要的功能之一。

微服务通常基于事件通信的架构构建。 应用程序被设计为对事件(或消息)做出反应。

响应式编程提供了一种可选的编程风格,专注于构建应对事件的应用程序。

虽然Java 8没有内置的响应式性编程支持,但是有一些框架提供了对响应式编程的支持:

Reactive Streams:尝试定义与语言无关的响应性API。

Reactor:Spring Pivotal团队提供的响应式编程的Java实现。

Spring WebFlux:启用基于响应式编程的Web应用程序的开发。 提供类似于Spring MVC的编程模型。


5. 函数式Web框架

除了响应式特性之外,Spring 5还提供了一个函数式Web框架。

函数式Web框架提供了使用函数式编程风格来定义endpoints的功能。 这里显示一个简单的hello world示例:

 RouterFunction<String> route =
route(GET("/hello-world"),
request -> Response.ok().body(fromObject("Hello World")));

函数式Web框架也可用于定义更复杂的路由(routes),如以下示例所示:

 RouterFunction<?> route = route(GET("/todos/{id}"),
request -> {
Mono<Todo> todo = Mono.justOrEmpty(request.pathVariable("id"))
.map(Integer::valueOf)
.then(repository::getTodo);
return Response.ok().body(fromPublisher(todo, Todo.class));
})
.and(route(GET("/todos"),
request -> {
Flux<Todo> people = repository.allTodos();
return Response.ok().body(fromPublisher(people, Todo.class));
}))
.and(route(POST("/todos"),
request -> {
Mono<Todo> todo = request.body(toMono(Todo.class));
return Response.ok().build(repository.saveTodo(todo));
}));

需要注意的几件重要事项如下:

  • RouterFunction评估匹配条件,以将请求路由到适当的处理程序函数。
  • 定义了三个endpoints,两个GET请求,一个POST请求,并将它们映射到不同的处理函数。

6. Jigsaw的Java模块化

在Java 8之前,Java平台不是模块化的。因此存在一些重要的问题:

  • Platform Bloa Java模块化在过去的几十年中并没有引起人们的关注。然而,通过物联网(IOT-Internet of Things)和新的轻量级平台,如 Node.js迫切需要解决Java平台的膨胀问题。(最初版本的JDK的大小小于10 MB。最近的JDK版本需要超过200 MB。)
  • JAR Hell 当ClassLoader找到一个类时,它不会看到是否有其他可用类的定义。 它立即加载找到的第一个类。 如果应用程序的两个不同部分需要来自不同jar包的同一个类,那么它们就无法指定要加载类的jar包。

Open System Gateway initiative(OSGi)是在1999年开始的一项计划,它将模块化引入到Java应用程序中。

每个模块(module )定义如下:

  • import 模块使用的其他包
  • export 模块导出的包

每个模块都可以有自己的生命周期。 它可以自行安装,启动和停止。

Jigsaw项目是Java Community Process(JCP)下的一个倡议,从Java 7开始,将模块化纳入Java。 它有两个主要目标:

  • 定义和实现JDK的模块化结构
  • 为Java平台上构建的应用程序定义模块系统

Jigsaw将成为Java 9的一部分,Spring Framework 5.0将包含对Jigsaw模块的基本支持。


7. 对Kotlin支持

Kotlin是一种静态类型的JVM语言,可以实现具有更好的表达性,简洁性和可读性的代码。 Spring框架5.0对Kotlin有很好的支持。

考虑一个简单的Kotlin程序,说明一个data类,如下所示:

import java.util.*
data class Todo(var description: String, var name: String, var
targetDate : Date)
fun main(args: Array<String>) {
var todo = Todo("Learn Spring Boot", "Jack", Date())
println(todo)
//Todo(description=Learn Spring Boot, name=Jack,
//targetDate=Mon May 22 04:26:22 UTC 2017)
var todo2 = todo.copy(name = "Jill")
println(todo2)
//Todo(description=Learn Spring Boot, name=Jill,
//targetDate=Mon May 22 04:26:22 UTC 2017)
var todo3 = todo.copy()
println(todo3.equals(todo)) //true
}

在不到10行代码中,我们创建并测试了一个具有三个属性和以下方法的数据bean:

  • equals()
  • hashCode()
  • toString()
  • copy()

Kotlin是强类型的。 但是不需要明确指定每个变量的类型:

  val arrayList = arrayListOf("Item1", "Item2", "Item3")
// Type is ArrayList

命名参数允许你在调用方法时指定参数的名称,从而保持更可读的代码:

var todo = Todo(description = "Learn Spring Boot",
name = "Jack", targetDate = Date())

Kotlin通过提供默认变量(it)和诸如takedrop等方法使函数式编程更简单:

 var first3TodosOfJack = students.filter { it.name == "Jack"
}.take(3)

还可以为Kotlin中的参数指定默认值:

  import java.util.*
data class Todo(var description: String, var name: String, var
targetDate : Date = Date())
fun main(args: Array<String>) {
var todo = Todo(description = "Learn Spring Boot", name = "Jack")
}

由于它的所有特性使代码简洁而富有表现力,我们希望Kotlin能够成为一门语言。


8. 舍弃的特性

Spring Framework 5是一个主要的Spring版本,基准大幅度增加。 随着Java,Java EE和其他几个框架的基准版本的增加,Spring Framework 5删除了对几个框架的支持:

  • Portlet
  • Velocity
  • JasperReports
  • XMLBeans
  • JDO
  • Guava

如果你正在使用上面任何框架,建议计划迁移并使用Spring Framework 4.3——该框架一直支持到2019年。

Spring Framework 5.0 新特性的更多相关文章

  1. 精进不休 .NET 4.5 (12) - ADO.NET Entity Framework 6.0 新特性, WCF Data Services 5.6 新特性

    [索引页][源码下载] 精进不休 .NET 4.5 (12) - ADO.NET Entity Framework 6.0 新特性, WCF Data Services 5.6 新特性 作者:weba ...

  2. Spring Boot 2(一):Spring Boot 2.0新特性

    Spring Boot 2(一):Spring Boot 2.0新特性 Spring Boot依赖于Spring,而Spring Cloud又依赖于Spring Boot,因此Spring Boot2 ...

  3. Spring Boot 2.0 新特性和发展方向

    以Java 8 为基准 Spring Boot 2.0 要求Java 版本必须8以上, Java 6 和 7 不再支持. 内嵌容器包结构调整 为了支持reactive使用场景,内嵌的容器包结构被重构了 ...

  4. 【2.0新特性】Spring Boot 2.0新特性

    以Java 8 为基准 Spring Boot 2.0 要求Java 版本必须8以上, Java 6 和 7 不再支持. 内嵌容器包结构调整 为了支持reactive使用场景,内嵌的容器包结构被重构了 ...

  5. Spring Boot实践——Spring Boot 2.0 新特性和发展方向

    出自:https://mp.weixin.qq.com/s/EWmuzsgHueHcSB0WH-3AQw 以Java 8 为基准 Spring Boot 2.0 要求Java 版本必须8以上, Jav ...

  6. Spring Boot 2.0 新特性

    这是一篇总结文章,主要收集 Spring Boot 2.0 相对于 Spring Boot 1.x 的新特性,本章节并不提供实践性质的源代码.在 Spring Boot 系列文章中会持续退出实践章节. ...

  7. Atitit spring 3.0 3.1 3.2 4.0 4.3 5.0 新特性

    Atitit spring 3.0 3.1 3.2 4.0 4.3 5.0 新特性 Spring3.0的新特性及其分析 - 我的人生不甘于平庸! - ITeye技术网站.html Spring3.0带 ...

  8. Spring框架入门之Spring4.0新特性——泛型注入

    Spring框架入门之Spring4.0新特性——泛型注入 一.为了更加快捷的开发,为了更少的配置,特别是针对 Web 环境的开发,从 Spring 4.0 之后,Spring 引入了 泛型依赖注入. ...

  9. Spring Boot 2.3.0 新特性Redis 拓扑动态感应

    本文为原创文章.欢迎任何形式的转载,但请务必注明出处 冷冷https://lltx.github.io. Spring Boot 2.3 新特性优雅停机详解 Spring Boot 2.3 新特性分层 ...

随机推荐

  1. docfx (一)

    什么是docFX? DocFX 是一个基于.NET的API文档生成器,当前支持 C# 和 VB.它可以通过你的代码中的三斜杠注释生成 API 参考文档.同样也支持你使用 Markdown 文件创建一些 ...

  2. SQL优化工具

    SQL优化工具 什么是索引? 打个比方,我们在使用MySQL用作查询的时候就好比查字典,索引就好比字典的偏旁部首页.如果没有索引我们查询一个文字就需要一页页的翻,显然这种方式效率很低.如果我们对某一字 ...

  3. 优化关键渲染路径CRP

    什么是关键渲染路径? 从收到 HTML.CSS 和 JavaScript 字节到对其进行必需的处理,从而将它们转变成渲染的像素这一过程中有一些中间步骤 浏览器渲染页面前需要先构建 DOM 和 CSSO ...

  4. CAP和BASE理论

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt370 1. CAP理论 2000年7月,加州大学伯克利分校的Eric Bre ...

  5. 交换基本数据类型的方法swap,并影响到主方法

    不知道朋友在哪里看到的问题,qq来问我,题目是:在不修改主方法的前提下使用一个方法交换两个int的值,方法如下: public static void main(String[] args) { In ...

  6. [C#] .Net Core 全局配置读取管理方法 ConfigurationManager

    最近在学习.Net Core的过程中,发现.Net Framework中常用的ConfigurationManager在Core中竟然被干掉了. 也能理解.Core中使用的配置文件全是Json,不想F ...

  7. 汽车VIN码识别适用于什么行业

    在您看完之前的文章知道了VIN码识别的原理,现在跟大家分享一下汽车VIN码识别的应用场景吧 汽车VIN码不仅在制造.销售.保养.保险.交易环节会需要录入汽车的VIN码,在交通事故处理中,作为汽车身份唯 ...

  8. NHibernate教程(13)--立即加载

    本节内容 引入 立即加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过上一篇的介绍,我们知道了NHibernate中默认的加载机制--延迟加载.其本质就是使用GoF23中代理模式 ...

  9. java初阶

    java的开发工具分成 IDE(integrated developmentenvironment )和JDk(Java Development Kit) 一个.java中只能有一个public类且至 ...

  10. 201521123034《Java程序设计》第八周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 List中指定元素的删除(题目4-1) 1.1 实验总结 答:这题是在课堂上 ...