[0242-06].第06節:SpringBoot對SpringMVC的自動配置

SpringBoot學習大綱


一、基于SpringBoot搭建Web工程:

1.1.編碼實現步驟:

a.創建SpringBoot項目

在這里插入圖片描述

b.選中依賴:選中我們所需要的模塊

在這里插入圖片描述


1.2.SSM中的WEB開發配置與SpringBoot中WEB開發自動配置對比:

a.SSM中的WEB開發:

  • 1.在SSM 整合時,需要手動配置 Tomcat 、配置 SpringMVC、配置如何掃描包、配置字符過濾器、配置視圖解析器、文件上傳等,如下圖所示的配置,非常麻煩。在這里插入圖片描述
    在這里插入圖片描述

b.SpringBoot中的web開發:

在SpringBoot 中,存在自動配置機制,提高開發效率

  • 1.導入web開發的場景:
    在這里插入圖片描述
  • 2.引入場景啟動器后,就引入了autoconfigure功能
  • 3.@EnableAutoConfiguration注解使用@Import(AutoConfigurationImportSelector.class)批量導入組件

二、SpringBoot在Web場景下的自動配置:

2.1.Web開發相關的自動配置類:

  • 1.如下是在引入web開發的場景啟動器后,會找到這些全類名,然后根據這些全類名批量加載自動配置類組件到容器中
    在這里插入圖片描述
  • 2.SpringBoot啟動默認加載 xxxAutoConfiguration(這些類就是自動配置類)這些類都在如下這個org包中:
    在這里插入圖片描述
  • 3.其中與web開發有關的自動配置類都在web目錄中

2.2.SpringBoot對SpringMVC自動配置

a.SpringBoot對SpringMVC自動的默認配置

在這里插入圖片描述

b.SpringBoot中對SpringMVC的定制化開發:

  • 1.全自動的默認配置:
    • 含義解釋:保持 SpringBootMVC的默認配置,并且自定義更多的 mvc 配置,如:interceptors, formatters, view controllers 等
    • 實現方式:使用@Configuration注解添加一個 WebMvcConfigurer 類型的配置類,并不要標注 @EnableWebMvc
  • 2.手動自動結合:
    • 含義解釋:保持 SpringBootMVC的默認配置,但要自定義核心組件實例,比如:RequestMappingHandlerMapping, RequestMappingHandlerAdapter, 或ExceptionHandlerExceptionResolver,
    • 實現方式:@Configuration 標注一個配置類,實現 WebMvcConfigurer 接口,給容器中放一個 WebMvcRegistrations 組件即可
  • 3.全手動方式:
    • 含義解釋:全面接管 Spring MVC
    • 實現方式:@Configuration 標注一個配置類,并加上 @EnableWebMvc注解,實現 WebMvcConfigurer 接口

2.3.分析WebMvcAutoConfiguration類的源碼:

a.定位SpringMVC相關的自動配置類源碼:

  • 1.SpringBoot中對SpringMVC功能的自動配置類WebMvcAutoConfiguration
    在這里插入圖片描述

b.WebMvcAutoConfiguration類源碼分析:

1、WebMvcAutoConfiguration類的源碼:

  • 可以看到這個類上@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)、@ConditionalOnClass()、ConditionalOnWebApplication條件注解
    在這里插入圖片描述

2、分析:WebMvcAutoConfiguration類生效條件

  • 1.@AutoConfiguration(after = { DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class })意思是在DispatcherServletAutoConfiguration、TaskExecutionAutoConfiguration(異步任務)、ValidationAutoConfiguration(數據校驗)配置好了之后,WebMvcAutoConfiguration再進行配置
  • 2.@ConditionalOnWebApplication(type = Type.SERVLET) 如果是web應用就生效,類型是SERVLET、REACTIVE響應式編程
  • 3.@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class }):容器中有Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class這些Bean才生效,這里我們引入了web場景,所以可以判斷出自動配置類是WebMvcAutoConfiguration是生效的
  • 4.@ConditionalOnMissingBean(WebMvcConfigurationSupport.class):容器中沒有WebMvcConfigurationSupport這個Bean才生效
  • 5.@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10):定義的是優先級

3、其他說明:

  • 1.如果創建xxxConfig類并實現WebMvcConfiger,就會使WebMvcAutoConfiguration配置類失效,因為在該類中有@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)這個注解會觸發
  • 2.@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)這個注解會觸發的原因是我們在自定義的xxConfig類中實現了WebMvcConfiger,點進WebMvcConfiger這個接口就可以知道它繼承了WebMvcConfigurationSupport,所以springboot自動幫我們配置好的webMvcAutoConfiguration就會失效,注意只是我們在xxxConfig類中重寫的default失效

c.分析當webMvcAutoConfiguration生效時會自動配置什么:

c1.配置了SpringMVC兼容Rest風格的請求
  • HiddenHttpMethodFilter;頁面表單提交Rest請求(GET、POST、PUT、DELETE)
    在這里插入圖片描述
c2.配置了表單內容的過濾器:
  • 1.可以配合HiddenHttpMethodFilter過濾器使用
  • 2.表單內容Filter,GET(數據放URL后面)、POST(數據放請求體)請求可以攜帶數據,PUT、DELETE 的請求體數據會被忽略,使用OrderedFormContentFilter可以實現PUT、DELETE類型的請求體不被忽略
    在這里插入圖片描述

c3.配置了靜態內部類:WebMvcAutoConfigurationAdapter

1、配置的靜態內部類WebMvcAutoConfigurationAdapter作用:

  • 靜態內部類WebMvcAutoConfigurationAdapter的作用就是給容器中放了WebMvcConfigurer組件;給SpringMVC添加各種定制功能

2、介紹靜態內部類WebMvcAutoConfigurationAdapter類所實現的WebMvcConfigurer接口:

====================== SpringBoot2中WebMvcAutoConfigurationAdapter類的源碼===================

  • 1.如下可以看到靜態內部類WebMvcAutoConfigurationAdapter僅實現了WebMvcConfigurer接口
    在這里插入圖片描述
    ====================== SpringBoot3中WebMvcAutoConfigurationAdapter類的源碼===================
  • 1.如下可以看到靜態內部類WebMvcAutoConfigurationAdapter實現了WebMvcConfigurer接口
    在這里插入圖片描述
  • 2.ctrl + F12可以看到WebMvcConfigurer接口中的所有方法,這些抽象方法提供了配置SpringMVC底層的所有組件的入口:
    在這里插入圖片描述
  • 3.下面我對接口中的抽象方法的功能進行了說明:
    在這里插入圖片描述

3、解析靜態內部類WebMvcAutoConfigurationAdapter上標注的注解:

========== ==SpringBoot2中靜態內部類WebMvcAutoConfigurationAdapter上標注的注解 =================

  • 1.注解1 @Configuration:在WebMvcAutoConfigurationAdapter類上有注解@Configuration,所以說這個類是屬于一個配置類
    在這里插入圖片描述
  • 2.注解2 @EnableConfigurationProperties 根據@EnableConfigurationProperties({WebMvcProperties.class,ResourceProperties.class})可見有xxxxproperties,這說明配置文件的屬性配置是和實體類xxx綁定在一起的
    在這里插入圖片描述
  • 3.由下圖可知:配置文件中WebMvcProperties==spring.mvcResourceProperties==spring.resources進行了綁定
    在這里插入圖片描述
  • 2.WebMvcProperties分析:
    在這里插入圖片描述
  • 3.ResourceProperties分析:
    在這里插入圖片描述

========== ==SpringBoot3中靜態內部類WebMvcAutoConfigurationAdapter上標注的注解 =================

  • 1.@EnableConfigurationProperties注解: 根據@EnableConfigurationProperties({ WebMvcProperties.class, WebProperties.class })可見有xxxxproperties,這說明配置文件的屬性配置是和實體類xxx綁定在一起的
    在這里插入圖片描述
  • 2.根據如下源碼可知:WebMvcProperties對配置文件中的spring.mvc 進行了綁定
    在這里插入圖片描述
  • 3.根據如下源碼可知:WebProperties對配置文件中的spring.web 進行了綁定
    在這里插入圖片描述

4、擴展知識當某個配置類只有一個有參構造器的時候,有參構造器所有參數的值都會從容器中確定

  • 這里的WebMvcAutoConfigurationAdapter配置類就是只有一個有參構造器!!!,所以所有參數的值都會從容器中確定
    在這里插入圖片描述
    • ResourceProperties resourceProperties;獲取和spring.resources綁定的所有的值的對象
    • WebMvcPropertiesmvcProperties :獲取和spring.mvc綁定的所有的值的對象
    • ListableBeanFactorybeanFactory :Spring的beanFactory(容器工廠)
    • HttpMessageConverters:找到所有的HttpMessageConverters
    • ResourceHandlerRegistrationCustomizer: 找到資源處理器的自定義器(重點)
    • ServletRegistrationBean:給應用注冊Servlet,Filter…

c4.配置了message Converters

在這里插入圖片描述


c5.配置了視圖解析器:

在這里插入圖片描述


c6.配置了資源處理器:
  • 1.在這個資源處理器方法中中設置了所有資源處理的默認規則,下面對其中的代碼進行分析:
    在這里插入圖片描述

1、查看resourceProperties中的第1個屬性是:isAddMappings,是和靜態資源訪問相關的

  • 1.在資源處理器源碼中可以看到先判斷this.resourceProperties.isAddMappings()是否為真
    在這里插入圖片描述
  • 2.this.resourceProperties的值是從哪里來的呢?? 根據源碼可知,是從這個類中的有參構造中獲取到的在這里插入圖片描述
  • 3.在構造器這里的resourceProperties的值是,都是從容器中拿到的
    在這里插入圖片描述

2、分析在isAddMappings()方法的含義:

  • 1.點擊isAddMappings(),查看isAddMappings()源碼
    在這里插入圖片描述
  • 2.在isAddMappings()方法中返回了isAddMappings的屬性值
    在這里插入圖片描述
  • 3.可以看到isAddMappings屬性的默認值是true:
    在這里插入圖片描述
  • 4.ResourcesProperties這個類是和spring.resources綁定在一起的,我在配置文件中設置isAddMappings值為false:
    在這里插入圖片描述
  • 5.我在配置文件配置后,所有的靜態資源都被禁用,執行在if判斷中的內容后就return了:
    在這里插入圖片描述

3、查看resourceProperties中的第二個屬性是:Cache,是和配置緩存策略相關的

  • 1.分析緩存配置:
    在這里插入圖片描述
  • 2.配置緩存配置時間,緩存時間以秒為單位:
    在這里插入圖片描述

4、再繼續分析下面的代碼:就是判斷webjars請求相關的了:

  • 1.當請求是webjars/**。就去資源目錄META-INF/下去查找資源,且同時設置了資源緩存的時間:
    在這里插入圖片描述
  • 2.請求測試設置的緩存時間是否生效:
    在這里插入圖片描述
    在這里插入圖片描述
c7.配置了歡迎頁的處理規則:
  • 1.HandlerMapping:就是處理器映射。在其中保存了每一個Handler能處理哪些請求
    	@Beanpublic WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext,FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(new TemplateAvailabilityProviders(applicationContext), applicationContext, getWelcomePage(),this.mvcProperties.getStaticPathPattern());welcomePageHandlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));welcomePageHandlerMapping.setCorsConfigurations(getCorsConfigurations());return welcomePageHandlerMapping;}WelcomePageHandlerMapping(TemplateAvailabilityProviders templateAvailabilityProviders,ApplicationContext applicationContext, Optional<Resource> welcomePage, String staticPathPattern) {if (welcomePage.isPresent() && "/**".equals(staticPathPattern)) {//要用歡迎頁功能,必須是/**logger.info("Adding welcome page: " + welcomePage.get());setRootViewName("forward:index.html");}else if (welcomeTemplateExists(templateAvailabilityProviders, applicationContext)) {// 調用Controller  /indexlogger.info("Adding welcome page template: index");setRootViewName("index");}}
  • 2.如下代碼截圖可以看到要用歡迎頁功能,請求路徑必須是/**,一旦加了前綴就失效了
    在這里插入圖片描述

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

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

相關文章

【21】Word:德國旅游業務?

目錄 題目 NO1.2.3 NO4 NO5.6 NO7 NO8.9.10.11 題目 NO1.2.3 F12&#xff1a;另存為布局→頁面設置→頁邊距&#xff1a;上下左右選中“德國主要城市”→開始→字體對話框→字體/字號→文本效果&#xff1a;段落對話框→對齊方式/字符間距/段落間距 NO4 布局→表對話框…

什么是軟件架構

什么是軟件架構 程序員說&#xff0c;軟件架構是要決定編寫哪些C程序或OO類、使用哪些庫和框架 程序經理說&#xff0c;軟件架構就是模塊的劃分和接口的定義 系統分析員說&#xff0c;軟件架構就是為業務領域對象的關系建模 配置管理員說&#xff0c;軟件架構就是開發出來的…

1/20賽后總結

1/20賽后總結 T1『討論區管理員』的旅行 - BBC編程訓練營 算法&#xff1a;IDA* 分數&#xff1a;0 damn it! Ac_code走丟了~~&#xff08;主要是沒有寫出來&#xff09;~~ T2華強買瓜 - BBC編程訓練營 算法&#xff1a;雙向DFS或者DFS剪枝 分數&#xff1a;0 Ac_code…

大數據與AI驅動的商業查詢平臺:企業市場拓展的變革引擎?

在競爭白熱化的商業環境里&#xff0c;企業對準確市場信息的高效獲取能力&#xff0c;直接關系到業務拓展的成敗。商業查詢平臺借助大數據和人工智能技術&#xff0c;為企業提供精準客戶篩選、市場拓展分析以及風險評估服務&#xff0c;正逐漸成為企業市場開拓的得力助手。本文…

redis 各個模式的安裝

一、Redis單機安裝 1、安裝gcc依賴 Redis是C語言編寫的&#xff0c;編譯需要GCC。 Redis6.x.x版本支持了多線程&#xff0c;需要gcc的版本大于4.9&#xff0c;但是CentOS7的默認版本是4.8.5。 升級gcc版本&#xff1a; yum -y install centos-release-scl yum -y install d…

TiDB 的優勢與劣勢

TiDB 的優勢與劣勢 TiDB 作為一款新興的分布式數據庫&#xff0c;在業界逐漸嶄露頭角。它兼具傳統關系型數據庫的特性&#xff0c;又充分利用分布式架構的優勢。那么&#xff0c;TiDB 究竟有怎樣的優缺點呢&#xff1f;今天我們來聊聊 TiDB 的優勢與劣勢&#xff0c;幫你全面了…

藍橋杯算法日常|c\c++常用競賽函數總結備用

一、字符處理相關函數 大小寫判斷函數 islower和isupper&#xff1a;是C標準庫中的字符分類函數&#xff0c;用于檢查一個字符是否為小寫字母或大寫字母&#xff0c;需包含頭文件cctype.h&#xff08;也可用萬能頭文件包含&#xff09;。返回布爾類型值。例如&#xff1a; #…

微服務知識——4大主流微服務架構方案

文章目錄 1、微服務聚合模式2、微服務共享模式3、微服務代理模式4、微服務異步消息模式 微服務是大型架構的必經之路&#xff0c;也是大廠重點考察對象&#xff0c;下面我就重點詳解4大主流微服務架構方案。 1、微服務聚合模式 微服務聚合設計模式&#xff0c;解決了如何從多個…

【HTML+CSS】使用HTML與后端技術連接數據庫

目錄 一、概述 1.1 HTML前端 1.2 后端技術 1.3 數據庫 二、HTML表單示例 三、PHP后端示例 3.1 連接數據庫 3.2 接收數據并插入數據庫 四、安全性 4.1 防止SQL注入 4.2 數據驗證與清洗 五、優化 5.1 索引優化 5.2 查詢優化 六、現代Web開發中的最佳實踐 6.1 使用…

T-SQL語言的數據庫編程

T-SQL語言的數據庫編程 1. 引言 在信息化迅速發展的今天&#xff0c;數據庫已經成為數據管理和使用的重要工具。其中&#xff0c;T-SQL&#xff08;Transact-SQL&#xff09;作為微軟SQL Server的擴展SQL語言&#xff0c;不僅用于數據查詢和管理&#xff0c;還能夠進行復雜的…

通信協議—WebSocket

一、WebSocket編程概念 1.1 什么是WebSocket WebSocket 是一種全雙工通信協議&#xff0c;允許在客戶端&#xff08;通常是瀏覽器&#xff09;和服務器之間建立持久連接&#xff0c;以實現實時的雙向通信。它是 HTML5 標準的一部分&#xff0c;相比傳統的 HTTP 請求&#xff…

cadence筆記--畫PMU6050原理圖和封裝

簡介 本文主要介紹使用Cadence自己畫一個PMU6050的原理圖PCB的實際用例&#xff0c;Cadence使用的是24.1版本。 原理圖 首先獲取PMU6050引腳參數&#xff0c;使用立創商城查詢PMU6050型號&#xff0c;點擊數據手冊如下圖所示&#xff1a; 如下圖所示&#xff0c;左邊是原理圖&…

CSS3 3D 轉換介紹

CSS3 中的 3D 轉換提供了一種在二維屏幕上呈現三維效果的方式&#xff0c;主要包括translate3d、rotate3d、scale3d等轉換函數&#xff0c;下面來詳細介紹&#xff1a; 1. 3D 轉換的基本概念 坐標系 在 CSS3 的 3D 空間中&#xff0c;使用的是右手坐標系。X 軸是水平方向&…

Text2SQL 智能報表方案介紹

0 背景 Text2SQL智能報表方案旨在通過自然語言處理&#xff08;NLP&#xff09;技術&#xff0c;使用戶能夠以自然語言的形式提出問題&#xff0c;并自動生成相應的SQL查詢&#xff0c;從而獲取所需的數據報表&#xff0c;用戶可根據得到結果展示分析從而為結論提供支撐&#…

FFmpeg音視頻采集

文章目錄 音視頻采集音頻采集獲取設備信息錄制麥克風錄制聲卡 視頻采集攝像機畫面采集 音視頻采集 DirectShow&#xff08;簡稱DShow&#xff09;是一個Windows平臺上的流媒體框架&#xff0c;提供了高質量的多媒體流采集和回放功能&#xff0c;它支持多種多樣的媒體文件格式&…

【漫話機器學習系列】056.F1值(F1 score)

F1值&#xff08;F1 Score&#xff09; 定義 F1值是機器學習中一種用于評估模型性能的指標&#xff0c;特別適合用于 不平衡數據集 的分類任務。它是 精確率&#xff08;Precision&#xff09; 和 召回率&#xff08;Recall&#xff09; 的調和平均值。通過綜合考慮精確率和召…

Mac安裝Homebrew

目錄 安裝修改homeBrew源常用命令安裝卸載軟件升級軟件相關清理相關 安裝 官網 https://brew.sh/不推薦官網安裝方式&#xff08;很慢很慢或者安裝失敗聯網失敗&#xff09; 檢測是否安裝homebrewbrew -v執行安裝命令 蘋果電腦 常規安裝腳本 &#xff08;推薦 完全體 幾分鐘就…

在K8S中,如果后端NFS存儲的IP發送變化如何解決?

在Kubernetes中&#xff0c;如果后端NFS存儲的IP地址發生了變化&#xff0c;您需要更新與之相關的Peristent Volume(PV)或Persistent Volume Claim(PVC)以及StorageClass中關于NFS服務器IP的配置信息&#xff0c;確保K8S集群內的Pod能夠正確連接到新的NFS存儲位置。解決方案如下…

一文大白話講清楚webpack基本使用——9——預加載之prefetch和preload以及webpackChunkName的使用

文章目錄 一文大白話講清楚webpack基本使用——9——預加載之prefetch和preload1. 建議按文章順序從頭看&#xff0c;一看到底&#xff0c;豁然開朗2. preload和prefetch的區別2. prefetch的使用3. preload的使用4. webpackChunkName 一文大白話講清楚webpack基本使用——9——…

【Elasticsearch 】 聚合分析:桶聚合

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…