三年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.pswp.cn/news/385637.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385637.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385637.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Array | 74. Search a 2D Matrix

題目&#xff1a;搜索二維矩陣 方法1&#xff1a; class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {if(!matrix.size())return false;if(!matrix[0].size())return false;for(int i 0; i < matrix[matrix.size() …

三年經驗java工資,含愛奇藝,小米,騰訊,阿里

1、PTP模型 Point-to-Point&#xff0c;點對點通信模型。PTP是基于隊列(Queue)的&#xff0c;一個隊列可以有多個生產者&#xff0c;和多個消費者。消息服務器按照收到消息的先后順序&#xff0c;將消息放到隊列中。隊列中的每一條消息&#xff0c;只能由一個消費者進行消費&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工作…