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.classspring.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/" };
也就是。只要我们在类路径下建立以下包
那么这些包里面所有的静态资源都能直接访问到。这也就是静态资源为什么要放在这些包下的原因。



