栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring静态资源配置原理 2.6.0

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring静态资源配置原理 2.6.0

自动配置类位置:

spring-boot-autoConfigre/web/servlet/WebMvcAutoConfiguration.class

自动配置类生效
@Configuration(proxyBeanMethods = false)//生效条件
@ConditionalOnWebApplication(type = Type.SERVLET)//生效条件
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, //生效条件WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)//生效条件
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
		ValidationAutoConfiguration.class })
容器配置
@Configuration(proxyBeanMethods = false)
	@import(EnableWebMvcConfiguration.class)
	@EnableConfigurationProperties({ WebMvcProperties.class, WebProperties.class })
	@Order(0)
	public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer, ServletContextAware {}

WebMvcProperties.classspring.mvc
WebProperties.class
spring.web

也就是我们在ymal中只需加上以上前缀即可自定义配置

静态资源默认扫描规则
@Override
		public void addResourceHandlers(ResourceHandlerRegistry registry) {
			if (!this.resourceProperties.isAddMappings()) {
				logger.debug("Default resource handling disabled");
				return;
			}
			addResourceHandler(registry, "/webjars/**", "classpath:/meta-INF/resources/webjars/");
			addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
				registration.addResourceLocations(this.resourceProperties.getStaticLocations());
				if (this.servletContext != null) {
					ServletContextResource resource = new ServletContextResource(this.servletContext, SERVLET_LOCATION);
					registration.addResourceLocations(resource);
				}
			});
		}

!this.resourceProperties.isAddMappings():其中isAddMappings()返回值为布尔值类型,该类返回adMappings;adMappings默认为ture。也就是开启静态资源默认扫描规则,我们可以通过在配置文件中设置该值来开启或关闭静态资源默认扫描规则。

注册访问规则

private void addResourceHandler(ResourceHandlerRegistry registry, String pattern, String... locations) {
			addResourceHandler(registry, pattern, (registration) -> registration.addResourceLocations(locations));
		}

SpringBoot 2.6.0版本相较于之前版本做了代码优化,这里用到了拉姆达表达式。提高了代码的复用性。
registry:ResourceHandlerRegistry对象,存储用于通过 Spring MVC 服务静态资源(例如图像,css 文件等)的资源处理程序的注册。 它允许设置为在 Web 浏览器中高效加载而优化的缓存头。 可以在 Web 应用根目录下,类路径等位置之外的位置提供资源。

pattern:需要拦截的请求

locations:静态资源地址,这里通过
(registration) -> registration.addResourceLocations(locations));
获取需要配置的静态资源地址。具体可点击addResourceLocations自行深入了解。

addResourceHandler(registry, "/webjars/**", "classpath:/meta-INF/resources/webjars/");

注册第一种访问规则

把webjars下的所有请求将在classpath:/meta-INF/resources/webjars/下面找,这也就反应了我们在项目中导入Jquery之后。只需在浏览器地址输入
/webjars/jquery/版本/jquery.min.js
就可以访问到Jquery的静态资源。而无需输入/meta-INF/resources/webjars/

个人见解:可以将访问规则理解成视图解析器。/webjars/**理解成前缀,"classpath:/meta-INF/resources/webjars/"理解成后缀。在开启访问规则之后,我们只需专注于资源名。而无需关注资源路径。

注册第二种访问规则

addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
				registration.addResourceLocations(this.resourceProperties.getStaticLocations());
				if (this.servletContext != null) {
					ServletContextResource resource = new ServletContextResource(this.servletContext, SERVLET_LOCATION);
					registration.addResourceLocations(resource);
				}
			});

this.mvcProperties.getStaticPathPattern()为请求的参数;这里我们点击getStaticPathPattern()可以发现其返回了一个字符串,如下:

	public String getStaticPathPattern() {
		return this.staticPathPattern;
	}

点击staticPathPattern(静态资源路径参数)
出现
private String staticPathPattern = “/**”;

则staticPathPattern默认值为/**

而在staticPathPattern所在类中使用了注解
@ConfigurationProperties(prefix = “spring.mvc”);
也就是我们可以在yaml中自定义staticPathPattern的值
如:

由于SpringBoot的配置优先原则,在我们配置了静态资源访问路径前缀之后则会以我们所配置的优先。则我们访问静态资源时需要加上前缀/res/.

第一中注册规则webjars/下的所有请求在路径
classpath:/meta-INF/resources/webjars/下面找,那么第二种注册规则/**呢?

第二种注册规则的资源路径通过以下方法获得。

registration.addResourceLocations(this.resourceProperties.getStaticLocations());

点击getStaticLocations()获取静态资源路径方法可以看到其返回了一个叫staticLocations
字符数组。再点击staticLocations可看见其有CLASSPATH_RESOURCE_LOCATIONS。而最后再点击这个常量。可以看见它的默认值。

		private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/meta-INF/resources/",
				"classpath:/resources/", "classpath:/static/", "classpath:/public/" };

也就是。只要我们在类路径下建立以下包

那么这些包里面所有的静态资源都能直接访问到。这也就是静态资源为什么要放在这些包下的原因。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/603551.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号