欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot靜態(tài)資源配置原理(源碼分析)

 更新時(shí)間:2021年01月14日 10:08:22   作者:MrYushiwen  
這篇文章主要介紹了SpringBoot靜態(tài)資源配置原理(源碼分析),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言:

我們都知道,SpringBoot啟動(dòng)會(huì)默認(rèn)加載很多xxxAutoConfiguration類(lèi)(自動(dòng)配置類(lèi))
其中SpringMVC的大都數(shù)功能都集中在WebMvcAutoConfiguration類(lèi)中,根據(jù)條件ConditionalOnxxx注冊(cè)類(lèi)對(duì)象;WebMvcAutoConfiguration滿足以下ConditionalOnxxx條件,類(lèi)是生效的,并把其對(duì)象注冊(cè)到容器中。

在這里插入圖片描述

那WebMvcAutoConfiguration生效給容器中配置了什么呢?

WebMvcAutoConfigurationAdapter靜態(tài)內(nèi)部類(lèi)

一.配置文件前綴

我們來(lái)看WebMvcAutoConfiguration類(lèi)中的WebMvcAutoConfigurationAdapter靜態(tài)內(nèi)部類(lèi):

在這里插入圖片描述

這是一個(gè)配置類(lèi),配置文件的屬性和xxx進(jìn)行了綁定。
再看@EnableConfigurationProperties({WebMvcProperties.class, ResourceProperties.class, WebProperties.class})
我們來(lái)看當(dāng)中的WebMvcProperties、ResourceProperties和WebProperties的字節(jié)碼文件
分別點(diǎn)進(jìn)這三個(gè)類(lèi)的字節(jié)碼文件中:

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

可以看到WebMvcProperties它是與配置文件前綴spring.mvc相關(guān)聯(lián)的。
ResourceProperties它是與配置文件前綴spring.resources相關(guān)聯(lián)。
WebProperties它是與配置文件前綴spring.web相關(guān)聯(lián)。

二.只有一個(gè)有參構(gòu)造器

WebMvcAutoConfigurationAdapter靜態(tài)內(nèi)部配置類(lèi)只有一個(gè)有參數(shù)的構(gòu)造器,那它會(huì)帶來(lái)什么特性呢?
它的有參構(gòu)造器中所有參數(shù)的值都會(huì)從容器中確定

public WebMvcAutoConfigurationAdapter(ResourceProperties resourceProperties, WebProperties webProperties, WebMvcProperties mvcProperties, ListableBeanFactory beanFactory, ObjectProvider<HttpMessageConverters> messageConvertersProvider, ObjectProvider<WebMvcAutoConfiguration.ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider, ObjectProvider<DispatcherServletPath> dispatcherServletPath, ObjectProvider<ServletRegistrationBean<?>> servletRegistrations) {
      this.resourceProperties = (Resources)(resourceProperties.hasBeenCustomized() ? resourceProperties : webProperties.getResources());
      this.mvcProperties = mvcProperties;
      this.beanFactory = beanFactory;
      this.messageConvertersProvider = messageConvertersProvider;
      this.resourceHandlerRegistrationCustomizer = (WebMvcAutoConfiguration.ResourceHandlerRegistrationCustomizer)resourceHandlerRegistrationCustomizerProvider.getIfAvailable();
      this.dispatcherServletPath = dispatcherServletPath;
      this.servletRegistrations = servletRegistrations;
      this.mvcProperties.checkConfiguration();
    }

我們來(lái)看下它的參數(shù):

  • 第一個(gè)參數(shù)是ResourceProperties resourceProperties 就是我們上面提到的@EnableConfigurationProperties({WebMvcProperties.class, ResourceProperties.class, WebProperties.class})中注冊(cè)開(kāi)啟的第二個(gè)類(lèi),獲取和spring.resources綁定的所有的值的對(duì)象
  • 第二個(gè)參數(shù)是WebProperties webProperties 就是我們上面提到的@EnableConfigurationProperties({WebMvcProperties.class, ResourceProperties.class, WebProperties.class})中注冊(cè)開(kāi)啟的第三個(gè)類(lèi),獲取和spring.web綁定的所有的值的對(duì)象
  • 第三個(gè)參數(shù)是WebMvcProperties mvcProperties 就是我們上面提到的@EnableConfigurationProperties({WebMvcProperties.class, ResourceProperties.class, WebProperties.class})中注冊(cè)開(kāi)啟的第一個(gè)類(lèi),獲取和spring.mvc綁定的所有的值的對(duì)象
  • 第四個(gè)參數(shù)是ListableBeanFactory beanFactory ,這個(gè)是Spring的beanFactory,也就是我們的容器。
  • 第五個(gè)參數(shù)是ObjectProvider messageConvertersProvider,找到所有的HttpMessageConverters
  • 第六個(gè)參數(shù)是ObjectProvider<WebMvcAutoConfiguration.ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider,找到資源處理器的自定義器
  • 第七個(gè)參數(shù)是ObjectProvider dispatcherServletPath,相當(dāng)與找dispatcherServlet能處理的路徑
  • 第八個(gè)參數(shù)是ObjectProvider<ServletRegistrationBean<?>> servletRegistrations ,給應(yīng)用注冊(cè)原生的Servlet、Filter等等

構(gòu)造器初始化后,我們已經(jīng)把所有的東西從容器中拿到了

三.源碼分析addResourceHandlers方法

所有的資源處理默認(rèn)規(guī)則都在addResourceHandlers方法中,如下:

public void addResourceHandlers(ResourceHandlerRegistry registry) {
      if (!this.resourceProperties.isAddMappings()) {
        logger.debug("Default resource handling disabled");
      } else {
        Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
        CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
        if (!registry.hasMappingForPattern("/webjars/**")) {
          this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{"/webjars/**"}).addResourceLocations(new String[]{"classpath:/META-INF/resources/webjars/"}).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl).setUseLastModified(this.resourceProperties.getCache().isUseLastModified()));
        }

        String staticPathPattern = this.mvcProperties.getStaticPathPattern();
        if (!registry.hasMappingForPattern(staticPathPattern)) {
          this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{staticPathPattern}).addResourceLocations(WebMvcAutoConfiguration.getResourceLocations(this.resourceProperties.getStaticLocations())).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl).setUseLastModified(this.resourceProperties.getCache().isUseLastModified()));
        }

      }
    }

1.禁用掉靜態(tài)資源的路徑映射

我們打上斷點(diǎn)看它的默認(rèn)規(guī)則是怎么起作用的,首先調(diào)用resourcePropertoes的isAddMappings()方法:

在這里插入圖片描述

判斷this.resourcePropertoes的isAddMappings()方法是不是不為true,

  • this.resourcePropertoes我們剛才在2中講構(gòu)造器時(shí)講到的ResourceProperties resourceProperties 就是我們上面提到的@EnableConfigurationProperties({WebMvcProperties.class, ResourceProperties.class, WebProperties.class})中注冊(cè)開(kāi)啟的第二個(gè)類(lèi),獲取和spring.resources綁定的所有的值的對(duì)象
  • isAddMappings()方法返回的是this.addMappings的值,如下:

在這里插入圖片描述

也就是說(shuō)我們可以通過(guò)設(shè)置addMappings的值是false還是true來(lái)讓這個(gè)if語(yǔ)句是否執(zhí)行
我們可以在配置文件中進(jìn)行設(shè)置:

在這里插入圖片描述

默認(rèn)它是true,如果是false,那么他就進(jìn)入if語(yǔ)句中,執(zhí)行logger.debug("Default resource handling disabled");后結(jié)束該方法,else中的所有配置都不生效

在這里插入圖片描述

else中的什么配置/webjars/**去哪找等等一些規(guī)則都不生效了。
也就是說(shuō)我們通過(guò)設(shè)置add-mappings: false 來(lái)禁用掉了靜態(tài)資源的路徑映射。
禁用后所有的靜態(tài)資源都訪問(wèn)不了了。

addMappings的值如果是true,那么他就不會(huì)進(jìn)入if語(yǔ)句中,而是進(jìn)入到else語(yǔ)句中,那么else語(yǔ)句的內(nèi)容都得到了執(zhí)行,下面我們看它是怎么配置靜態(tài)資規(guī)則的。

2.源碼分析webjars的底層規(guī)則

進(jìn)入到else語(yǔ)句中,第一行是Duration cachePeriod = this.resourceProperties.getCache().getPeriod();,它從resourceProperties里面獲取到關(guān)于緩存的相關(guān)值。我們?cè)趛aml配置文件中配置一下這個(gè)值:

在這里插入圖片描述

緩存時(shí)間是以秒為單位的,如下:

在這里插入圖片描述

意思就是我們所有的靜態(tài)資源默認(rèn)可以緩存存儲(chǔ)多少秒

我們debug接著往下走,看到cachePeriod中取到了剛剛yaml中設(shè)置的6666,以后我們的瀏覽器就會(huì)把我們的靜態(tài)資源緩存6666秒:

在這里插入圖片描述

debug接著往下走,我們到了注冊(cè)"/webjars/**"這個(gè)規(guī)則的地方:

if (!registry.hasMappingForPattern("/webjars/**")) {
          this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{"/webjars/**"}).addResourceLocations(new String[]{"classpath:/META-INF/resources/webjars/"}).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl).setUseLastModified(this.resourceProperties.getCache().isUseLastModified()));
        }

也就是說(shuō)我們?cè)L問(wèn)/webjars下面的所有請(qǐng)求都找我們的classpath:/META-INF/resources/webjars/路徑,其中還設(shè)置了其靜態(tài)資源的緩存時(shí)間為6666秒。

拿jquery來(lái)舉例,為什么我們導(dǎo)入jquery之后,我們只需要訪問(wèn)/webjars/jquery/3.5.1/jquery.js就能夠訪問(wèn)到/META-INF/resources/webjars/jquery/3.5.1/jquery.js,如下:

在這里插入圖片描述

在這里插入圖片描述

其緩存時(shí)間也可以在瀏覽器中看到為6666秒:

在這里插入圖片描述

3.源碼分析默認(rèn)靜態(tài)資源路徑的底層規(guī)則

我們?cè)趀lse里面接著往下debug,接著我們用mvcProperties屬性調(diào)用其getStaticPathPattern()方法

在這里插入圖片描述

  • this.mvcProperties我們剛才在2中講構(gòu)造器時(shí)講到的WebMvcProperties mvcProperties 就是我們上面提到的@EnableConfigurationProperties({WebMvcProperties.class, ResourceProperties.class, WebProperties.class})中注冊(cè)開(kāi)啟的第一個(gè)類(lèi),獲取和spring.mvc綁定的所有的值的對(duì)象
  • getStaticPathPattern()方法,這個(gè)方法返回的是staticPathPattern的值,如下:

在這里插入圖片描述

staticPathPattern的這個(gè)值可以在我們的配置文件中進(jìn)行配置,它的默認(rèn)值是/**,如下:

在這里插入圖片描述

我們也可以把前綴配置成/resource/**,如下:

在這里插入圖片描述

debug接著往下走,接下來(lái)調(diào)用的方法與上面的webjars是一樣的方法,只不過(guò)參數(shù)有所不同:

在這里插入圖片描述

接下來(lái)我們具體看代碼:

String staticPathPattern = this.mvcProperties.getStaticPathPattern();
        if (!registry.hasMappingForPattern(staticPathPattern)) {
          this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{staticPathPattern}).addResourceLocations(WebMvcAutoConfiguration.getResourceLocations(this.resourceProperties.getStaticLocations())).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl).setUseLastModified(this.resourceProperties.getCache().isUseLastModified()));
        }

把剛剛的前綴staticPathPattern得到后作為實(shí)參傳入hasMappingForPattern方法中,注冊(cè)前綴這個(gè)規(guī)則,剛剛我們?cè)趛aml中設(shè)置了前綴為/resource/**,也就是說(shuō)我們?cè)L問(wèn)/resource/**下面的所有請(qǐng)求都找我們的this.resourceProperties.getStaticLocations() 路徑,其中也設(shè)置了其靜態(tài)資源的緩存時(shí)間為6666秒。
this.resourceProperties.getStaticLocations()方法返回的值是什么呢?我們點(diǎn)進(jìn)去看一下:

在這里插入圖片描述

this.resourceProperties.getStaticLocations()返回的是this.staticLocations,這個(gè)staticLocations定義如下:

在這里插入圖片描述

可以看到它是一個(gè)字符串?dāng)?shù)組,在無(wú)參構(gòu)造器中進(jìn)行了初始化,初始化的值是CLASSPATH_RESOURCE_LOCATIONS常量,常量的值為:

“classpath:/META-INF/resources/”, “classpath:/resources/”, “classpath:/static/”, "classpath:/public/“。這就解釋了靜態(tài)資源路徑為什么默認(rèn)為這四個(gè)路徑。

看到這里你有沒(méi)有恍然大悟,

到此這篇關(guān)于SpringBoot靜態(tài)資源配置原理(源碼分析)的文章就介紹到這了,更多相關(guān)SpringBoot靜態(tài)資源配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于BIO的Java Socket通信詳解

    基于BIO的Java Socket通信詳解

    這篇文章主要為大家詳細(xì)介紹了基于BIO的Java Socket通信相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Spring自動(dòng)掃描無(wú)法掃描jar包中bean的解決方法

    Spring自動(dòng)掃描無(wú)法掃描jar包中bean的解決方法

    在日常開(kāi)發(fā)中往往會(huì)對(duì)公共的模塊打包發(fā)布,然后調(diào)用公共包的內(nèi)容。然而,最近對(duì)公司的公共模塊進(jìn)行整理發(fā)布后。spring卻無(wú)法掃描到相應(yīng)的bean,下面這篇文章主要給大家介紹了關(guān)于Spring自動(dòng)掃描時(shí)無(wú)法掃描jar包中bean的解決方法,需要的朋友可以參考下。
    2017-06-06
  • springboot?整合sentinel的示例代碼

    springboot?整合sentinel的示例代碼

    本文主要介紹了springboot?整合sentinel的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 詳解Java數(shù)據(jù)結(jié)構(gòu)和算法(有序數(shù)組和二分查找)

    詳解Java數(shù)據(jù)結(jié)構(gòu)和算法(有序數(shù)組和二分查找)

    本篇文章主要介紹了詳解Java數(shù)據(jù)結(jié)構(gòu)和算法(有序數(shù)組和二分查找),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • springboot+jwt+微信小程序授權(quán)登錄獲取token的方法實(shí)例

    springboot+jwt+微信小程序授權(quán)登錄獲取token的方法實(shí)例

    本文主要介紹了springboot+jwt+微信小程序授權(quán)登錄獲取token的方法實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 吊打Java面試官之Lambda表達(dá)式 Stream API

    吊打Java面試官之Lambda表達(dá)式 Stream API

    這篇文章主要介紹了吊打Java之jdk8的新特性包括Lambda表達(dá)式、函數(shù)式接口、Stream API全面刨析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • java如何將pdf轉(zhuǎn)換成image

    java如何將pdf轉(zhuǎn)換成image

    這篇文章主要為大家詳細(xì)介紹了java如何將pdf轉(zhuǎn)換成image,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 徹底搞懂Java多線程(三)

    徹底搞懂Java多線程(三)

    這篇文章主要給大家介紹了關(guān)于Java面試題之多線程和高并發(fā)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Spring在多線程下保持事務(wù)的一致性的方法實(shí)現(xiàn)

    Spring在多線程下保持事務(wù)的一致性的方法實(shí)現(xiàn)

    當(dāng)Spring在多線程環(huán)境下運(yùn)行時(shí),確保事務(wù)一致性是非常重要的,本文主要介紹了Spring在多線程下保持事務(wù)的一致性的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • 使用synchronized實(shí)現(xiàn)一個(gè)Lock代碼詳解

    使用synchronized實(shí)現(xiàn)一個(gè)Lock代碼詳解

    這篇文章主要介紹了使用synchronized實(shí)現(xiàn)一個(gè)Lock代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12

最新評(píng)論