Spring Framework 5 FAQ
什么是Spring Framework 5?
Spring Framework 5是Spring Framework的主要版本升级,已经有好几年了。它引入了一个名为Spring WebFlux的新的非阻塞Web框架 ,它使用Reactor 来支持Reactive Streams API。它还提供了一个替代注释控制器的函数式编程,一流的Kotlin语言支持,以及与JUnit 5的一流集成。它基于Java 8语言特性,旨在与Java 9一起使用。
有关更多详细信息,请参阅参考文档,或观看 Juergen Hoeller的Spring Framework 5主题和趋势。
Spring Boot是否支持Spring Framework 5?
是的,Spring Boot 2.x系列是基于Spring Framework 5. Spring Boot 2.0 预计将 在Spring Framework 5.0之后普遍可用,旨在围绕SpringOne Platform的时间框架。请暂时使用最新的Spring Boot 2.0里程碑,已经发布了Spring Framework 5.0。有关最新版本,请查看spring.io/spring-boot 网站或GitHub。
我们为什么要介绍Spring WebFlux?
阻塞线程消耗资源。对于需要处理大量并发请求的延迟敏感型工作负载,非阻塞异步编程模型更有效。这对于移动应用程序和互连的微服务尤其重要,并且通常用于具有许多客户端和不均匀工作负载的场景。
Spring WebFlux的目标是为Spring开发人员提供类似于node.js的非阻塞事件循环样式编程模型。有关更多详细信息和演示,请通过Rossen Stoyanchev观看使用Spring Framework 5的五个用例 和反应式Web应用程序中的Servlet vs Reactive Stacks。
我可以在Spring Framework 5中使用Spring MVC吗?
当然,基于Servlet的Spring MVC仍然作为新WebFlux框架的一流选择。升级到Spring Framework 5不需要重写您的应用程序以使用Spring WebFlux。无论如何,如果您正在开发无法从非阻塞编程模型中受益的Web应用程序,或者使用阻塞JPA或JDBC API来实现持久性(通常与线程绑定事务结合使用),请继续使用Spring MVC。
作为奖励,Spring MVC还支持反应式返回类型作为其DeferredResult功能的替代方案,允许使用新的WebClient或反应式数据存储驱动程序进行异步响应,即使在传统的Servlet安排中也是如此。但请注意,只有完整的WebFlux堆栈才能在事件循环模型中提供完全无阻塞的I / O.
Mono和Flux是什么?
Spring Framework 5中的WebFlux框架使用Reactor 作为其异步基础。此项目提供核心类型,Mono 表示单个异步值,Flux 表示异步值流。它还提供了一个操作库, 用于操作这些值。有关更多信息,请参阅 GitHub上的reactor-core 和reactive-streams-commons项目。
如何使我的所有代码都无阻塞?
要使处理程序完全无阻塞,您需要在整个处理链中使用反应库,一直到持久层。反应性Spring数据库已经可用于Cassandra,MongoDB,Redis和Couchbase。请注意,JPA和JDBC本质上是阻止API; 我们仍在等待非阻塞关系数据库驱动程序的共同点。
其他已经被动的Spring项目包括Spring Security,Spring Vault和Spring Cloud Stream。
如果我的数据库没有反应库,该怎么办?
处理阻塞和非阻塞代码混合的一个建议是使用微服务边界的功能将阻塞后端数据存储代码与非阻塞前端API分离。或者,您也可以使用工作线程池来阻止操作,从而使主事件循环保持非阻塞状态。
与RxJava等其他反应库的互操作性如何?
Reactor使用与RxJava相同的底层Pub / Sub API和其他 基于Reactive Streams的库(Kaazing,Lightbend,Netflix,Pivotal,Red Hat,Twitter等众多工程师之间的协作)。
WebFlux中的带注释的处理程序方法(以及在有限的程度上甚至在Spring MVC中)也可以声明RxJava 1.x或2.x类型,框架会自动调整相应的Reactor发布者。如果您碰巧拥有基于RxJava的驱动程序和/或对基于RxJava的处理逻辑的偏好,这很有意义。
我还可以用注释编写控制器方法吗?
是的,Spring MVC和Spring WebFlux都支持使用@ Controller,@ RequestMapping等相同的基于注释的编程模型。而不是获取线程的所有权并立即执行工作,WebFlux控制器方法对异步请求和响应类型进行操作。
我可以在不使用注释的情况下编写控制器方法吗?
是的,对于喜欢避免注释和反射神奇的开发人员,Spring Framework 5提供了一种新的功能API, 可以通过编程方式匹配路由和处理程序功能。这可以通过Java 8中的第一个类函数支持使用lambdas或方法引用来实现。有关如何组合处理程序的更多信息,请参阅 Arjen Poutsma 撰写的Spring Framework 5:Functional Web Framework中的新文章。
WebFlux框架将运行哪些HTTP服务器?
WebFlux框架侧重于Tomcat和Jetty以及Netty和Undertow('underow-core',不需要'underow-servlet')。由于它旨在支持异步编程,因此框架永远不会公开Servlet API - 但它可以将其Reactive Streams层调整到封面下的Servlet 3.1容器的非阻塞功能上(对Tomcat和Jetty的最佳支持以及最佳 - 在运行时对其他Servlet容器的适应性)。
HTTP客户端代码怎么样?
该AsyncRestTemplate已弃用赞成新的Web客户端提供了一个更流畅的API,并且能够既同步和异步在一个封装的。RestTemplate本身并没有被弃用,使用它没有任何问题; WebClient可以被视为更现代化的继承者
Spring Framework 5是否适用于Java 6或Java 7?
不,Spring Framework 5需要Java 8或更高版本。请继续使用Spring Framework 4.3 for Java 6/7场景。
Spring Framework 5是否适用于新的Java 9模块系统?
是的,Spring Framework 5在Spring Framework 5 jar的清单中附带了自动模块名称条目。Spring库的公共API表面保持不变。
Spring Framework 5是否支持Kotlin?
是的,Spring Framework 5正式支持Kotlin。有关更多详细信息,请参阅Kotlin支持文档。在Spring Framework 5中还有两篇关于Kotlin支持的博文:在Spring Framework 5和Spring Framework 5中引入Kotlin支持,功能方式是SébastienDeleuze。
如何升级到Spring Framework 5?
有关迁移到Spring Framework 5的详细信息,请参阅此Wiki页面。