资讯中心

Spring框架5.0版本发布相关的技术访谈


作者:Amit K Gupta

Spring框架5.0版本在2017年9月28日发布,在特性中包含了一个新的反应式Web框架。Pivotal的产品市场主管Pieter Humphrey将这个版本描述为该项目自2004年诞生以来最重要的发布版本。

在这个发布版本中,Spring 5.0的整个代码库都是基于Java 8源码级别的。Spring 5.0完全兼容JDK 9进行开发和部署。

Spring 5.0的反应式Web框架名为Spring WebFlux,它构建在Reactor 3.1项目之上,同时支持注解和函数式风格编程。InfoQ与Pivotal的高级工程师Rossen Stoyanchev进行了交流,讨论了他对Spring 5.0强调反应式编程的看法。
Stoyanchev:通过Java 8的CompletableFuture,Java开发人员已经熟悉了采用连续(continuation)风格的API来组合异步逻辑的好处。在最近几年间,我们看到出现了一些库用于组合异步逻辑,比如RxJava和Reactor,它们提供了与CompletableFuture类似的收益,但它们处理的是流式值并且支持回压(backpressure,在Reactive Streams规范中所定义的)。
Spring框架5.0版本借助一个Web框架,能够让应用拥抱这种异步编程模型,这个Web框架本身的核心协议是完全异步的,内部采用了非阻塞的I/O,在异步运行时环境上支持Reactive Streams回压功能,这些运行时环境包括Netty、Undertow以及像Tomcat和Jetty这样的Servlet容器(基于Servlet 3.1非阻塞I/O)。这种方式所带来的最重要的好处就是能够结合事件轮询风格的执行模型来组合异步逻辑,这样就能以更少的硬件资源处理更多的并发请求,在高负载场景下,它的作用会更加明显。
Stoyanchev说Spring 5.0引入的变化对希望升级的已有应用不会带来影响,因为新功能是与Spring MVC并存的。

在大多数的应用中,要么导入spring-webmvc(Servlet技术栈),要么导入spring-webflux(Reactive技术栈),已有的应用可以很容易地升级到Spring 5版本的spring-webmvc。

按照Stoyanchev的说法,Spring 5.0努力在Spring MVC和Spring WebFlux之间提供一致的体验,开发人员可以在两者之间做出选择。这两个Web框架通过灵活的控制器方法签名,支持相同的注解编程模型。除此之外,Spring WebFlux还提供了可选的、函数式的Web端点编程模型,将其与Java 8 lambdas和内置的Kotlin扩展协同使用是很有吸引力的。
在Spring框架5.0中,我们实际上对Spring MVC进行了扩展,使其支持反应式的返回值,这样的话,就允许Spring MVC控制器使用反应式WebClient和其他的反应式库,比如反应式数据repositories,在这个过程中,依然能够在任意的Servlet 3.1+容器中基于Servlet的Web端点技术进行操作。
InfoQ还咨询了Stoyanchev,如果希望采用Spring 5.0的反应式编程模型的话,开发人员有什么需要预先注意的地方。

开发人员应该了解从编写命令式风格的逻辑转移到使用声明式、异步的API时,有一个很大的学习曲线。另外,异步和非阻塞的代码也更难调试,因为调用栈不再是唯一的。如果你刚刚开始接触的话,建议从小范围开始,留出足够的时间去学习和适应。要慎重选择最适合,并且能够从非阻塞并发中获益最多的应用。在决定开始之前,要衡量和证明性能方面所能带来的收益。另外需要记住的是,有些地方是很容易上手的,比如在已有的Spring MVC应用中使用反应式WebClient。
InfoQ还与Spring框架项目的领导者Juergen Hoeller进行了交流,了解了他对Spring 5.0的想法。

Hoeller:我们以Java 8+作为基线,这样能够为整个框架带来重要的API改善和众多的内部优化。同时,Spring框架5.0能够完全支持JDK 9,它能够同时支持classpath以及模块路径。
核心容器为Java 8和Kotlin提供了函数式bean注册的机制。

Hoeller补充说,Spring 5.0还为常见的Spring API提供了Kotlin扩展,比如JdbcTemplate和RestTemplate,并且还支持对Kotlin数据类(data class)进行数据绑定。

Hoeller总结了Spring 5.0其他重要的特性:
Spring框架5.0在运行时支持Java EE 8 API级别,比如支持将Servlet 4.0的PushBuilder注入到Spring MVC处理器方法中、用于JSON转换的标准JSON Binding API(作为Jackson和Gson的替代方案)、JPA 2.2持久化技术以及注解驱动校验的Bean Validation 2.0。综上所述,我们的基线依然是Java EE 7+级别,依然支持所有的Servlet 3.1、JPA 2.1提供商等等。