SpringMvc的原理深度剖析及源碼解讀

一、springmvc啟動加載流程

1、引入spring-web.jar包時,在這個包的META-INF/services/javax.servlet.ServletContainerInitializer文件中定義的加載類SpringServletContainerInitializer,提供給springmvc實現初始化的操作。

2、在SpringServletContainerInitializer類中,通過@HandlesTypes來引入WebApplicationInitializer。

3、自己自定義的啟動類只要繼承了WebApplicationInitializer類并實現了onStartUp方法,那么servlet容器在啟動的時候就會拿到自己自定義的啟動類,并開始啟動。

啟動原理:servlet容器在初始化的時候會加載到SpringServletContainerInitializer類,然后這個類中通過@HandlesTypes來引入WebApplicationInitializer子類,然后回調傳遞ServletContext上下文,此處使用的是模板方法。

springmvc是如何來替代web.xml的?核心就是使用的SpringServletContainerInitializer類。

二、攔截器與過濾器區別

相同點:

????????攔截器和過濾器都是基于Aop實現,能夠對請求執行之前和之后實現攔截。

不同點:

????????過濾器是基于Servlet容器實現,對Web請求之前和之后實現攔截

????????攔截器不需要依賴于Servlet、不僅可以實現Web請求進行攔截,還有對其他方法攔截等。

????????過濾器比攔截器先執行,攔截器封裝的方法比過濾器攔截使用起來更加簡單。

應用場景:

????????攔截器:權限控制、日志打印、參數驗證、會話信息。

????????過濾器:編碼轉換、跨域解決、xss攻擊。

三、DispatcherServlet底層源碼分析

1.執行doDispatch;

2.調用getHandler方法獲取請求目標的方法 ?也就是? 請求url映射路徑對應的控制層具體的方法;

handlerMappings的作用查找控制器位置,比如xml和注解方式;

3.調用getHandlerAdapter獲取控制層適配器 RequestMappingHandlerAdapter;

4.執行攔截器前置方法 preHandle() 如果返回為true的話;

5.執行實際請求目標方法 返回modeAndView對象;

6.執行攔截器PostHandle()方法;

7.設置渲染視圖層內容;

8.執行攔截器afterCompletion方法;

四、SpringMVC控制對象初始化流程

1、HttpServletBean類的init() 方法2、FrameworkServlet類的initServletBean() 方法 → ?initWebApplicationContext()3、DispatcherServlet類的onRefresh() 方法 → ?initStrategies()方法
protected void initStrategies(ApplicationContext context) {initMultipartResolver(context);//初始化上傳文件解析器(或者是多部分請求解析器)initLocaleResolver(context);//初始化本地化解析器initThemeResolver(context);//初始化主題解析器initHandlerMappings(context);//初始化處理器映射器initHandlerAdapters(context);//初始化處理器適配器initHandlerExceptionResolvers(context);//初始化處理器異常解析器initRequestToViewNameTranslator(context);//初始化請求到視圖名翻譯器initViewResolvers(context);//初始化視圖解析器initFlashMapManager(context);//初始化重定向數據管理器
}

五、SpringMVC中的適配器

????????適配器模式:將一個系統的接口轉換成另外一種形式,從而使原來不能直接調用的接口變得可以調用。使用適配器可以針對不容的handler類型找到不同的適配器來實現執行目標方法。

SpringMVC中有以下幾種適配器:

1、繼承Controller方式所使用的適配器:SimpleControllerHandlerAdapter

2、 HTTP請求處理器適配器:HttpRequestHandlerAdapter

3、注解方式(@Controller)的處理器適配器:RequestMappingHandlerAdapter

適配器模式應用場景

1.?? Mybatis多種日志框架的整合(logback、log4j)

2.?? SpringMVC適配器模式

3.?? 新老版本的兼容問題

適配器模式源碼分析

1.使用getHandlerAdapter獲取對應的hanlder的具體HandlerAdapter2.HandlerAdapter接口有如下的子 c處理請求適配器2.1繼承Controller方式所使用的適配器:SimpleControllerHandlerAdapter2.2 HTTP請求處理器適配器:HttpRequestHandlerAdapter 2.3注解方式(@Controller)的處理器適配器:RequestMappingHandlerAdapter如果不采用適配器的話 :
If(hanlder instanceof Controller){// 執行Controller適配器
}If(hanlder instanceof? HttpControler){// 執行我們的HttpController
}If(hanlder instanceof? ServletControler){// 執行我們的HttpController
}If(hanlder instanceof? AnnotationControler){// 執行我們的AnnotationController
}

六、SpringMvc異步實現方式

異步支持需要注意的兩個地方

* 1、config類中開啟異步@EnableAsync

* 2、初始化類中 dynamic.setAsyncSupported(true);//開啟springmvc異步

1、第一種方式:直接在接口上添加@Async注解來實現

@Async
public String getMember(){try {System.out.println("2、業務處理開始,線程名稱"+Thread.currentThread().getContextClassLoader());Thread.sleep(3000);System.out.println("3、業務處理完畢,線程名稱"+Thread.currentThread().getContextClassLoader());}catch (Exception e){e.printStackTrace();}return "member";
}

2、第二種方式:使用Callable類的方式

/*** 異步支持需要注意的兩個地方* 1、config類中開啟異步@EnableAsync* 2、初始化類中 dynamic.setAsyncSupported(true);//開啟springmvc異步* Callable這種方式也是需要等業務線程處理完畢后,才會返回給客戶端,為了避免等待時間,可以在客戶端寫一個定時器來查詢處理結果*/
@RequestMapping("/asyncMember")
@ResponseBody
public Callable<String> asyncMember(){Callable<String> callable = new Callable<String>() {public String call() throws Exception {//耗時的時間都可以放在這個里面去處理String member = memberService.getMember();return member;}};return callable;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918117.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918117.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918117.shtml

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

相關文章

【ESP32-menuconfig(1) -- Build Type及Bootloader config】

Build Type Bootloader configmenuconfig介紹Build typeCONFIG_APP_BUILD_TYPECONFIG_APP_BUILD_TYPE_PURE_RAM_APPCONFIG_APP_REPRODUCIBLE_BUILDCONFIG_APP_NO_BLOBSCONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERSCONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERSBootloader config…

C++信息學奧賽一本通-第一部分-基礎一-第3章-第1節

C信息學奧賽一本通-第一部分-基礎一-第3章-第1節 2051 偶數 #include <iostream>using namespace std;int main() {int number; cin >> number;if (number % 2 0) {cout << "yes";} }2052 范圍判斷 #include <iostream>using namespace std…

自由學習記錄(79)

PBRBRDF原理&Unity實現深入淺出_嗶哩嗶哩_bilibili 進行改進 一個像素點對應一個范圍內的 一個微表面--一個由無數個起起伏伏的結構組成的物理結構 屏幕上的每一個像素點&#xff0c;在渲染時通常會被視為一個“微表面”的代表 比如在這個圖中&#xff0c;只關心紅色的區…

復雜路況誤報率↓78%!陌訊輕量化模型在車輛違停識別的邊緣計算優化?

一、行業痛點&#xff1a;動態交通場景的識別困境據《2024中國智慧交通白皮書》統計&#xff0c;城市核心路段違停誤報率高達35%&#xff0c;主要源于兩大難點&#xff1a;??短暫停靠干擾??&#xff1a;出租車臨時停靠與違停行為特征重疊??復雜背景干擾??&#xff1a;樹…

大語言模型提示工程與應用:提示詞基礎使用方式

提示詞使用方式 學習目標 在本課程中&#xff0c;我們將學習更多關于提示詞使用方式。 相關知識點 提示詞使用 學習內容 1 提示詞使用 1.1 文本摘要 語言模型最典型的應用場景之一就是文本摘要。我們可以通過以下提示實現基礎摘要功能&#xff1a; 提示: 解釋抗生素是什么回答&…

常見命令-資源查看-iostat命令實踐

文章目錄 系統中未安裝 iostat 命令 1. 監控CPU與磁盤的基礎負載 2. 診斷I/O性能瓶頸 3. 實時監控與動態采樣 4. 特定設備或分區的精細化監控 5. 性能測試與基準數據生成 6. 結合其他工具進行綜合調優 總結 結果輸出速查表 第一部分:CPU統計信息 第二部分:設備/磁盤統計信息(…

WinForm 實戰 (進度條):用 ProgressBar+Timer 打造動態進度展示功能

目錄 核心控件解析? ProgressBar 進度條? Timer 定時器? 實戰案例 常見應用場景? 總結? 在 WinForm 桌面應用開發中&#xff0c;進度反饋是提升用戶體驗的關鍵環節。無論是文件處理、數據加載還是復雜計算&#xff0c;一個直觀的進度條能讓用戶清晰了解任務狀態&…

使用 ast-grep 精準匹配指定類的方法調用(以 Java 為例)

使用 ast-grep 精準匹配指定類的方法調用&#xff08;以 Java 為例&#xff09; 在代碼重構、安全審計或靜態分析的場景中&#xff0c;我們常常需要匹配某個特定類中定義的方法調用。而 ast-grep 作為一款基于語法樹的代碼搜索工具&#xff0c;提供了強大的模式匹配功能&#…

Dijkstra?spfa?SPstra?

帶負權的無負環最短路問題 對于一張有負邊權的圖&#xff0c;普通 Dijkstra 就不能用了&#xff0c;比如&#xff1a;正常的 Dijkstra 擴散的節點依次為 1,3,2,41,3,2,41,3,2,4。 這時候可以發現&#xff0c;當點 222 擴散的時候&#xff0c;原本達到點 333 的路徑長度是 111&a…

React函數組件靈魂搭檔:useEffect深度通關指南!

你以為它只是替代componentDidMount&#xff1f;數據抓取、事件綁定、定時清理...&#xff1f;事實上&#xff0c;useEffect才是函數組件的“幕后操控者”&#xff01;但依賴數組的坑、閉包的陷阱&#xff0c;你真的玩轉了嗎&#xff1f; 告別“能用就行”&#xff0c;今天帶你…

LabVIEW實驗室測試框架

在實驗室測試場景中&#xff0c;選用合適的 LabVIEW 框架能夠極大提升測試效率、優化測試流程并保障測試結果的準確性。介紹幾款常用且功能強大的 LabVIEW 測試框架&#xff1a;?TestStand?框架概述?TestStand 是 NI 公司專為測試系統開發設計的一款測試執行管理框架。它能夠…

Kiro :從“規范”到“實現”的全流程 AI 助手

為什么是 Kiro Kiro 是一款面向“規范驅動開發”&#xff08;Spec-Driven Development&#xff09;的 AI 開發助手。與只在“寫代碼”環節輔助不同&#xff0c;Kiro 將“從需求到設計再到實現”的完整鏈路顯性化&#xff0c;把需求、設計、任務分解、代碼與測試、文檔等全部納…

【0基礎PS】PS工具詳解--矩形工具

目錄前言一、矩形工具的基礎認知?二、矩形工具的選項欄詳解?三、矩形工具的繪制技巧?四、矩形工具的實際應用場景?五、常見問題與解決方案?總結前言 在 Photoshop&#xff08;簡稱 PS&#xff09;的眾多繪圖工具中&#xff0c;矩形工具是使用率極高的基礎工具之一。無論是…

移動端app專項測試

學習目標&#xff1a;app專項測試知識點&#xff0c;其他知識擴充一、app專項&#xff08;app怎么測試/app側重點在哪&#xff09;1.功能&#xff1a;跟前面功能測試一樣&#xff08;跟需求文檔提取測試點&#xff0c;編寫測試用例&#xff09;2.安裝1.不同品牌安裝,不同操作系…

Spring Boot 結合 CORS 解決前端跨域問題

Spring Boot 結合 CORS 解決前端跨域問題 1. 背景 在前后端分離的項目中&#xff0c;前端&#xff08;例如 http://localhost:3000&#xff09;調用后端接口&#xff08;例如 http://localhost:8080&#xff09;時&#xff0c;瀏覽器會因為 同源策略 限制而阻止請求&#xff0c…

GPT-5 發布:微小進步難掩瓶頸,AI 行業或迎冷靜

北京時間 8 月 8 日凌晨,OpenAI 的 GPT-5 在萬眾期待中登場。距離 GPT-4 發布已過去兩年半,然而這場發布會卻未重現 ChatGPT 初現時的驚艷,也沒有 GPT-4 的跨越式升級,更無 o1 發布時的震撼。1 小時 20 分鐘的發布會,充斥著不驚艷的測試數據、與競品難分高下的用例展示,甚…

僵尸進程、孤兒進程、進程優先級、/proc 文件系統、CRC 與網絡溢出問題處理(實戰 + 原理)

僵尸進程 / 孤兒進程&#xff1a;是什么、為什么會出現、如何定位與清理進程優先級&#xff1a;nice/priority、CFS 與實時調度、I/O 優先級、cgroup 限流/proc 文件系統&#xff1a;最常用路徑與診斷手法CRC 校驗&#xff1a;在存儲/網絡里的作用與局限、抓包“校驗錯誤”的常…

GPT-5 不僅是版本升級,它標志著 推理能力的商業化 和 Agent操作系統 的崛起,開啟了 AI革命時代。

GPT-5 不僅是版本升級&#xff0c;它標志著 推理能力的商業化 和 Agent操作系統 的崛起&#xff0c;開啟了 AI革命時代。 核心技術亮點&#xff1a; 商業化推理能力&#xff1a;AI不僅生成文本&#xff0c;還能 自動解決復雜任務&#xff0c;提升工作效率。 Agent操作系統&…

【C#】掌握并發利器:深入理解 .NET 中的 Task.WhenAll

在現代 .NET 應用程序開發中&#xff0c;異步編程&#xff08;Asynchronous Programming&#xff09;已成為提升性能、改善響應能力和充分利用多核處理器的關鍵技術。async 和 await 關鍵字極大地簡化了異步代碼的編寫&#xff0c;而 Task 類則是這一模型的核心。在處理多個并發…

微型導軌在半導體制造中有哪些高精密應用場景?

微型導軌在半導體制造中用于晶圓對準和定位系統&#xff0c;確保晶圓在光刻、蝕刻等工藝中精確移動。其高精度、高剛性、低摩擦和緊湊設計等特性&#xff0c;使其成為半導體設備實現微米級運動控制的核心部件。光刻機&#xff1a;在光刻工藝中&#xff0c;微型導軌支撐并引導掩…