链接:https://my.oschina.net/u/3953752/blog/2051297

前言

对 Java 开发者来说, Spring 发布了 5.0 正式版后的一大特色,就是 Reactive Web 方案 Web Flux,这是用来替代 Spring Web MVC 的吗?或者,只是终于可以不再基于 Servlet 容器了?

再见SpringMVC!这个框架直接干掉了Servlet,你有过迷茫吗

SpringMVC概述图

基于 Servlet 容器的 Web MVC

身为 Java 开发者,对于 Spring 框架并不陌生。它起源于 2002 年、Rod Johnson 著作《Expert One-on-One J2EE Design and Development》中的 Interface 21 框架,到了 2004 年,推出 Spring 1.0,从 XML 到 3.0 之后,支持 JavaConfig 设定;进一步,在 2014 年时,除了 Spring 4.0 之外,首次发表了Spring Boot,最大的亮点是采用自动组态,令基于 Spring 的快速开发成为可能。

对 Web 开发者来说,Spring 中的 Web MVC 框架,也一直随着 Spring 而成长,然而由于基于 Servlet 容器,早期被批评不易测试(例如:控制器中包含了 Servlet API)。

不过,从实操 Controller 介面搭配 XML 设定,到后来的标注搭配 JavaConfig,Web MVC 使用越来越便利。如果愿意,也可采用渐进的方式,将基于 Servlet API 的 Web 应用程序,逐步重构为几乎没有 Servlet API 的存在,在程序代码层面达到屏蔽 Servlet API 的效果。

由于不少 Java 开发者的 Web 开发经验,都是从 Servlet 容器中累积起来的,在这个时候,Web MVC 框架基于 Servlet API,就会是一项优点。因为,虽然运用 Web MVC 编写程序时,可做到不直接面对 Servlet API,然而,也意味着更强烈地受到 Spring 的约束,有时则是无法在设定或 API 中找到对应方案,有时也因为心智模型还是挂在 Servlet 容器,经验上难以脱离,在搞不出 HttpSession、ServletContext 对应功能时,直接从 HttpSession、ServletContext 下手,毕竟也是个方法。

编写程序时,就算没用到 Servlet API,Web MVC 基于 Servlet 容器仍是事实,因为,底层还是得借助 Servlet 容器的功能,例如 Spring Security,本质上还是基于 Servlet 容器的 Filter 方案。

然而在今日,Servlet 被许多开发者视为陈旧、过时技术的象征,或许是因为这样,在 Java EE 8 宣布推出的这段期间,当在某些场合谈及 Servlet 4.0 之时,总会听到有人提出“Web Flux 可以脱离 Servlet 了”之类的建议。

实现 Reactive Streams 的 Reactor

Web Flux 不依赖 Servlet 容器是事实,然而,在谈及 Web Flux 之前,我们必须先知道 Reactor 项目,它是由 Pivotal 公司,也就是目前 Spring 的拥有者推出,实现了 Reactive Streams 规范,用来支持 Reactive Programming 的实作品。

既然是实现了 Reactive Streams 规范,开发者必然会想到的是 RxJava/RxJava 2,或者是 Java 9 的 Flow API。这也意谓着,在能使用 Web Flux 之前,开发者必须对于 Reactive Programming 典范,有所认识。

开发者这时有疑问了,Spring 为何不直接基于 RxJava 2,而是打造专属的 Reactive Streams 项目呢?

就技术而言,Reactor 是在 Java 8 的基础上开发,并全面拥抱 Java 8 之后的新 API,像是 Lambda 相关介面、新日期与时间 API 等,这意谓着,项目如果还是基于 Java 7 或更早版本,就无法使用 Reactor。

在 API 层面,RxJava 2 有着因为历史发展脉络的原因,不得不保留一些令人容易困惑或混淆的型态或操作,而 Reactor 在这方面,都有着明确的对应 API 来取代,然而,却也提供与 RxJava 2(甚至是 Flow API)间的转换。

另一方面,Reactor 较直觉易用,例如最常介绍的 Mono 与 Flux,实现了 Reactive Streams 的 Publisher界面,并简化了信息发布,让开发者在许多场合,不用处理 Subscriber 和 Subscription 的细节(当然,这些在 Reactor 也予以实现)。而在 Spring Web Flux 中,Mono 与 Flux 也是主要的操作对象。想知道如何使用Mono与Flux,可以参考〈使用 Reactor 进行反应式编程〉

笔者福利

以下是小编自己针对马上即将到来的金九银十准备的一套“面试宝典”,不管是技术还是HR的问题都有针对性的回答。

有了这个,面试踩雷?不存在的!

需要这套“面试宝典”的,点击这里即可免费获取!回馈粉丝,诚意满满!!!

再见SpringMVC!这个框架直接干掉了Servlet,你有过迷茫吗
再见SpringMVC!这个框架直接干掉了Servlet,你有过迷茫吗
再见SpringMVC!这个框架直接干掉了Servlet,你有过迷茫吗
再见SpringMVC!这个框架直接干掉了Servlet,你有过迷茫吗