三年Java开发,尚学堂java马士兵全套

基于 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 进行反应式编程〉

又一个 Web 框架?

到了 Spring 5,在 Reactor 的基础上,新增了 Web Flux 作为 Reactive Web 的方案,我们在许多介绍文件的简单示例,例如〈使用 Spring 5 的 WebFlux 开发反应式 Web 应用〉,就看到当中使用了 Flux、Mono 来示范,而且,程序的代码看起来就像是 Spring MVC。

这是因为 Web Flux 提供了基于 Java 注解的方式,有许多 Web MVC 中使用的标注,也拿来用在 Web Flux 之中,让熟悉 Web MVC 的开发者也容易理解与上手 Web Flux,然而,这不过就是新的 Web 框架吗?

实际上,当然不是如此。Web Flux 并不依赖 Web MVC,而且它是基于 Reactor,本质属于非同步、非阻断、Reactive Programming 的心智模型,也因此,如果打算将 Web Flux 运行在 Servlet 容器之上,必须是支持 Servlet 3.1 以上,因为才有非阻断输入输出的支持,虽然 Web Flux 的 API 在某些地方,确实提供了阻断的选项,若单纯只是试着将基于 Web MVC 的应用程序,改写为套用 Web Flux,并不会有任何益处,反而会穷于应付如何在 Web Flux 实现对应的方案。

例如,此时,Spring Security 显然就不能用了,毕竟是 Spring 基于 Servlet 的安全方案,开发者必须想办法套用 Spring Security Reactive;而且,在储存方案上,也不是直接采用 Spring Data,而是 Spring Data Reactive 等。

就算能套用相关的设定与 API,要能获得 Web Flux 的益处,应用程序中相关的元件,也必须全面检视,重新设计为非阻断、基于 Reactive Programming 方式,这或许才是最困难、麻烦的部份。

除了基于 Java 注解的方式,让熟悉 Web MVC 的开发者容易理解之外,Web Flux 还提供了基于函数式的设计与组态方式。

实际上,在运用 RxJava 2/Reacto r等 Reactive Streams 的实操时,我们也都必须熟悉函数式的思考方式,才能充分掌握,这点在 Web Flux 并不例外。

可以脱离 Servlet 容器了?

Servlet 容器是个旧时代的象征,如果能够屏蔽 Servlet 容器或相关 API,许多开发者应该都会很开心,可以少一层抽象,不必使用肥肥的 Servlet 容器,当然会是使用 Web Flux 时附带的优点,然而,如果只是为了屏蔽 Servlet,其实,早就有其他技术选择存在。

基于 Servlet 一路发展过来的 Web MVC,虽然目前在某些地方可以安插一些函数式的设计,然而,本质上不变的部分在于,在技术堆叠中所隐含的,仍是一个基于同步、阻断式、命令式的心智模型。如果在这样的堆叠中,开发者老是因为想要实现非同步、非阻断、Reactive、函数式而感到不快,Web Flux 也许才会是可考虑的方案,而不单只是用来作为脱离 Servlet 容器,Web MVC 的替代品。

整体而言,Web Flux 还算是新技术,也还有待时间验证可行性,如果只是为了想用 Web Flux 来取代 Web MVC,或者更小一点的野心,只是想要能脱离 Servlet 容器,最好在采取行动之前,全面检视一下,确认自身或团队成员是否准备好接受 Web Flux 的心智模型,或者真的存在着对应的应用场景吧。

最后:学习总结——MyBtis知识脑图(纯手绘xmind文档)

学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。下方即为我手绘的MyBtis知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的MyBtis知识脑图原件(包括上方的面试解析xmind文档)

image

除此之外,前文所提及的Alibaba珍藏版mybatis手写文档以及一本小小的MyBatis源码分析文档——《MyBatis源码分析》等等相关的学习笔记文档,也皆可分享给认可的朋友!

资料领取方式:戳这里免费下载

友!

资料领取方式:戳这里免费下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/385637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三年经验java工资,含爱奇艺,小米,腾讯,阿里

1、PTP模型 Point-to-Point,点对点通信模型。PTP是基于队列(Queue)的,一个队列可以有多个生产者,和多个消费者。消息服务器按照收到消息的先后顺序,将消息放到队列中。队列中的每一条消息,只能由一个消费者进行消费&a…

三面美团Java岗,java多线程匿名内部类

Part 1微服务架构设计概述 1.1 传统应用架构的问题 1.2 微服务架构是什么 1.3 微服务架构有哪些特点和挑战 1.4 如何搭建微服务架构 Part 2微服务开发框架 2.1 Spring Boot 是什么 2.2 如何使用Spring Boot框架 2.3 Spring Boot生产级特性 Part 3微服务网关 3.1 Node.js 是什…

函数signal

1. 函数signal #include <signal.h> void (*signal(int sig,void (*func)(int)))(int)typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 分析&#xff1a; signal参数信号名&#xff0c;func的值是SIG_ING、SIG_DFL或接到…

三面美团Java岗,java架构师线下培训

性能优化专栏 1.Tomcat性能优化整理 2.JVM性能优化专题 3.Mysql性能优化整理 微服务架构面试专栏 1.SpringCloud面试整理 2.SpringBoot面试整理 3.Dubbo面试整理 并发编程高级面试专栏 开源框架面试题专栏 1.Spring面试整理 2.SpringMVC面试整理 3.MyBatis面试整理 分布式面…

信号 09 | SIGCLD语义

1. SIGCLD信号 SIG_DFL &#xff1a;默认的处理方式是不理会这个信号&#xff0c;但是也不会丢弃子进程状态&#xff0c;所以如果不用wait&#xff0c;waitpid对其子进行进行状态信息回收&#xff0c;会产生僵尸进程。SIG_IGN &#xff1a;忽略的处理方式&#xff0c;这个方式…

三面美团Java岗,java电子书下载百度云

Spring 全家桶&#xff1a; Spring 原理Spring面试题思维导图面试题Spring视频 Spring 原理 Spring特点Spring 核心组件Spring常用模块Spring主要包Spring常用注解Sping第三方结合Spring 10C原理Spring APO原理Spring MVC原理Spring Boot原理JPA原理Mybatis缓存Tomcat架构 Sp…

【信号】函数kill、raise、abort、alarm

一、函数kill 1. kill函数原型&#xff1a; int kill(pid_t pid, int signo); //signo:信号名分析&#xff1a; pid > 0&#xff1a; 发送信号给指定的进程pid 0&#xff1a; 发送信号给调用kill函数进程属于同一个进程组的所有进程pid < 0&#xff1a;信号signo将…

三面美团Java岗,尚学堂java马士兵全套

SpringBoot经典之作 进入Spring Boot世界 准备开发环境搭建开发工具 基础 Spring Boot基础分层开发Web应用程序响应式编程 进阶 Spring Boot进阶用ORM操作SQL数据库接口架构风格——RESTful集成安全框架&#xff0c;实现安全认证和授权集成Redis&#xff0c;实现高并发集成R…

信号 09 | 信号概念

信号的概念 信号在我们的生活随处可见&#xff0c;如&#xff1a;古代战争中摔杯为号&#xff1b;代战争中的信号弹&#xff1b;体育比赛中使用的信号枪&#xff0c;它们都有共性&#xff1a;1. 简单 2. 不能携带大量的信息 3. 满足某个特定条件才发送 信号是信息的载体&…

一招彻底帮你搞定HashMap源码,项目实战

ES 集群架构演进之路 1、初始阶段 订单中心ES初始阶段如一张白纸&#xff0c;架设方案基本没有&#xff0c;很多配置都是保持集群默认配置。整个集群部署在集团的弹性云上&#xff0c;ES集群的节点以及机器部署都比较混乱。同时按照集群维度来看&#xff0c;一个ES集群会有单…

【信号】信号集、sigprocmask、sigpending

一、信号集操作函数 内核通过读取未决信号集来判断信号是否应被处理。信号屏蔽字mask可以影响未决信号集。而我们可以在用程序自定义set来改变mask&#xff0c;来达到屏蔽指定信号目的。 sigset_t set; // typedef unsigned long sig…

一招让你拿下seata分布式事务框架,看这篇文章准没错!

第一阶段&#xff1a;架构师筑基必备技能 我觉得&#xff0c;但凡是个成年人应该都清楚扎实的基本功对自己的工作帮助有多重要。从各大招聘网站的招聘要求来看&#xff0c;第一条都明确说明需要扎实的Java基础。因此&#xff0c;一般笔试以及面试的第一轮&#xff0c;对基础的…

函数signal、sigaction

二、函数sigaction 修改信号处理动作(通常在Linux用来注册一个信号的捕捉函数) #inlcude<signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 参数&#xff1a; act&am…

一文了解OOM及解决方案,你还看不明白?

InnoDB总体结构 首先我们来看官网的一张图(图片来源于MySQL官网)&#xff1a; 从上图中可以看出其主要分为两部分结构&#xff0c;一部分为内存中的结构(上图左边)&#xff0c;一部分为磁盘中的结构(上图右边) 内存结构 InnoDB内存中的结构主要分为&#xff1a;Buffer Pool,…

信号 09 | 函数pause

函数pause 调用该函数可以造成进程主动挂起&#xff0c;等待信号唤醒&#xff0c;调用该系统调用的进程处于阻塞状态(主动放弃CPU)直到有信号递达将其唤醒。 将进程置为可中断睡眠状态。然后 它调用schedule()&#xff0c;使linux进程调度器找到另一个进程来运行。pause使调用…

一文搞懂JVM架构和运行时数据区,全网最新

1.Java基础面试知识点 Java中和equals和hashCode的区别int、char、long各占多少字节数int与integer的区别探探对Java多态的理解String、StringBuffer、StringBuilder区别什么是内部类&#xff1f;内部类的作用抽象类和接口区别抽象类的意义抽象类与接口的应用场景抽象类是否可…

一条正确的Java职业生涯规划,帮你突破瓶颈

面试题模块介绍&#xff1a; 一、Java 基础 JDK 和 JRE 有什么区别&#xff1f; 和 equals 的区别是什么&#xff1f;两个对象的 hashCode()相同&#xff0c;则 equals()也一定为 true&#xff0c;对吗&#xff1f;final 在 java 中有什么作用&#xff1f;java 中的 Math.roun…

【线程】线程基本函数

一、pthread_self函数 功能&#xff1a;获取线程ID。 pthread_t pthread_self(void); 线程ID&#xff1a;pthread_t类型&#xff0c;本质&#xff1a;在Linux为无符号整数(%lu)&#xff0c;其他系统可能是结构体实现线程ID是进程内部识别标志。&#xff08;两个进程间&#…

一条正确的Java职业生涯规划,顺利通过阿里Java岗面试

珍藏版&#xff08;1&#xff09;——Mybatis入门 1.什么是MyBatis 2.为什么我们要用Mybatis? 3.Mybatis快速入门 3.1 导入开发包 3.2准备测试工作 3.3 创建mybatis配置文件 3.4 编写工具类测试是否获取到连接 3.5 创建实体与映射关系文件 3.6 编写DAO 4.Mybatis工作…

一次违反常规的Java大厂面试经历,系列教学

第一部分 Java相关以及答案 答案 第二部分算法跟编程 第三部分html&JavaScript&ajax部分 答案 第四部分Javaweb部分 答案 第五部分数据库部分 答案 第六部分XML部分 答案 第七部分.流行的框架与新技术 答案 第八、九部分.软件工程与设计模式以及j2ee部分 最后 笔者…