0


SpringBoot——静态资源及原理

优质博文:IT-BLOG-CN

一、使用 SpringBoot 的步骤

【1】创建

SpringBoot

应用,选中自己需要的模块。
【2】

SpringBoot

已经默认将这些场景配置好,只需要在配置文件中指定少量配置就可以运行起来。
【3】编写业务逻辑代码。

二、自动配置原理

我们要了解

SpringBoot

帮我们配置了什么?能不能修改?能修改那些配置?能不能扩展等等。
【1】

xxxAutoConfiguration

:帮我们给容器中自动配置组件。
【2】

xxxProperties

:配置来封装配置文件的内容。

三、SpringBoot 对静态资源的映射规则

当创建一个

jar

工程时,想引入

css

等静态资源时,需要遵守

SpringBoot

的静态资源映射关系,通过

WebMvcAutoConfiguration

查看静态配置资源的规则。

//添加资源映射addResourceHandlerspublicvoidaddResourceHandlers(ResourceHandlerRegistry registry){if(!this.resourceProperties.isAddMappings()){
        logger.debug("Default resource handling disabled");}else{Integer cachePeriod =this.resourceProperties.getCachePeriod();if(!registry.hasMappingForPattern("/webjars/**")){this.customizeResourceHandlerRegistration(registry.addResourceHandler(newString[]{"/webjars/**"}).addResourceLocations(newString[]{"classpath:/META-INF/resources/webjars/"}).setCachePeriod(cachePeriod));}// 3中说明String staticPathPattern =this.mvcProperties.getStaticPathPattern();if(!registry.hasMappingForPattern(staticPathPattern)){this.customizeResourceHandlerRegistration(registry.addResourceHandler(newString[]{staticPathPattern}).addResourceLocations(this.resourceProperties.getStaticLocations()).setCachePeriod(cachePeriod));}}}

【1】如上配置的

/webjars/**

可知,所有的获取都去

classpath:/META-INF/resources/webjars

下找资源。而

webjar

实际上是以

jar

包的方式引入静态资源,可以参考官方文档

▶ 获取

Jquery

jar

包依赖:

<dependency><groupId>org.webjars</groupId><artifactId>jquery</artifactId><version>3.3.1-1</version></dependency>

▶ 进入导入的

Jquery

jar

包中,查看目录结构如下:所有的

/webjars/**

,都去

classpath:/META‐INF/resources/webjars/

找资源。例如:

localhost:8080/webjars/jquery/3.3.1/jquery.js

(在访问的时候,只需要写

webjars

下面资源的名称即可)

【2】同时可以在

ResourceProperties

设置与静态资源有关的参数,例如缓存时间。

@ConfigurationProperties(
    prefix ="spring.resources",
    ignoreUnknownFields =false)publicclassResourcePropertiesimplementsResourceLoaderAware,InitializingBean{

【3】除了

/webjars/**

,我们看下紧接着的第二个方法获取

staticPathPattern

路径:最终方法指向 =

/**

访问当前项目的任何资源(静态资源的文件夹)。

this.staticPathPattern ="/**";

如果没有进行处理,就会从如下路径中进行获取:

classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/" "/":当前项目根路径 ,以上就是静态资源的文件处理。
privatestaticfinalString[]SERVLET_RESOURCE_LOCATIONS=newString[]{"/"};//当前项目根路径privatestaticfinalString[]CLASSPATH_RESOURCE_LOCATIONS=newString[]{"classpath:/META-INF/resources/","classpath:/resources/","classpath:/static/","classpath:/public/"};privatestaticfinalString[]RESOURCE_LOCATIONS;static{RESOURCE_LOCATIONS=newString[CLASSPATH_RESOURCE_LOCATIONS.length +SERVLET_RESOURCE_LOCATIONS.length];System.arraycopy(SERVLET_RESOURCE_LOCATIONS,0,RESOURCE_LOCATIONS,0,SERVLET_RESOURCE_LOCATIONS.length);System.arraycopy(CLASSPATH_RESOURCE_LOCATIONS,0,RESOURCE_LOCATIONS,SERVLET_RESOURCE_LOCATIONS.length,CLASSPATH_RESOURCE_LOCATIONS.length);}

【4】获取欢迎页,通过如下代码可知:静态资源文件夹下的所有

index.html

页面,都被“/**”映射。(

localhost:8080

——就能够访问首页)

// 获取欢迎页@BeanpublicWebMvcAutoConfiguration.WelcomePageHandlerMappingwelcomePageHandlerMapping(ResourceProperties resourceProperties){returnnewWebMvcAutoConfiguration.WelcomePageHandlerMapping(resourceProperties.getWelcomePage(),this.mvcProperties.getStaticPathPattern());}//进入如上的resourceProperties.getWelcomePage()方法,会获取到当前项目路径下的index.html文件。privateString[]getStaticWelcomePageLocations(){String[] result =newString[this.staticLocations.length];for(int i =0; i < result.length;++i){String location =this.staticLocations[i];if(!location.endsWith("/")){
            location = location +"/";}

        result[i]= location +"index.html";}return result;}//进入如上的this.mvcProperties.getStaticPathPattern()方法,获取映射的路径this.staticPathPattern ="/**";

【5】所有的

**/favicon.ico

都是从静态文件中获取一个

favicon.ico

文件。图标:​

@Configuration@ConditionalOnProperty(
    value ={"spring.mvc.favicon.enabled"},
    matchIfMissing =true)publicstaticclassFaviconConfiguration{privatefinalResourceProperties resourceProperties;publicFaviconConfiguration(ResourceProperties resourceProperties){this.resourceProperties = resourceProperties;}@BeanpublicSimpleUrlHandlerMappingfaviconHandlerMapping(){SimpleUrlHandlerMapping mapping =newSimpleUrlHandlerMapping();
        mapping.setOrder(-2147483647);//默认获取图标的位置和名称
        mapping.setUrlMap(Collections.singletonMap("**/favicon.ico",this.faviconRequestHandler()));return mapping;}}

【6】也可以在

application.properties

全局配置文件中自定义静态文件:在配置文件中设置如下,那么默认的就不在生效。

# 配置文件是一个数组,可以用逗号进行分隔
spring.resources.static-locations=classpath:/hello/,calsspath:/xxx/
标签: spring boot 后端 java

本文转载自: https://blog.csdn.net/zhengzhaoyang122/article/details/134520496
版权归原作者 程序猿进阶 所有, 如有侵权,请联系我们删除。

“SpringBoot——静态资源及原理”的评论:

还没有评论