首先讲一下SpringBoot自动装配的原理
这一部分太重要,懒得自己过一遍,放一个狂神的链接:
总结SpringBoot的自动装配的核心步骤:
xxxAutoConfiguration… 向容器中自动配置组件
xxxProperties: 自动配置类,可以通过配置文件对原有属性进行修改!!
现在考虑静态资源放哪
因为在SpringBoot中,文件夹是标准的mvn项目文件夹,没有webapp文件夹,因此要考虑静态资源放哪里的问题。
首先双击shift查找WebMvcAutoConfiguration
到WebMvcAutoConfiguration即mvc自动配置类
往下拉找到WebMvcAutoConfigurationAdapter中addResourceHandlers 方法:
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
} else {
this.addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
registration.addResourceLocations(this.resourceProperties.getStaticLocations());
if (this.servletContext != null) {
ServletContextResource resource = new ServletContextResource(this.servletContext, "/");
registration.addResourceLocations(new Resource[]{resource});
}
});
}
}
第二行if:如果被自定义配置了,那么做if语句内部的事情-失效原有的配置,能自定义配置的原因就是:WebMvcAutoConfiguration类绑定了配置文件WebMvcProperties,
可见WebMvcProperties类上加了@ConfigurationProperties注解,说明绑定了yaml文件中的spring.mvc(前缀) !!!可以通过新建yaml文件,在里面写:spring.mvc:static-path-patten=…就可以修改该属性!!
只要自定义了该属性,那么就执行第二行if后面的语句!
再回到addResourceHandlers方法
前面说到,只要重新自定义动手修改 了属性的值,就不执行else,但如果没动,就执行else语句,语句的意思是,引入wenjar官网的maven依赖,该j静态文件会保存在/META-INF/resources/webjars/里,当然访问这个静态文件时,只要localhost:8080/webjars/
再加上文件名即可访问到该静态文件!
当然还有其他方式,往下看:
点进resourceProperties,部分代码如下:
public static class Resources {
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
private String[] staticLocations;
private boolean addMappings;
private boolean customized;
private final WebProperties.Resources.Chain chain;
private final WebProperties.Resources.Cache cache;
意思说,第一个classpath就是刚刚所讲的在webjar官网引入的maven依赖时产生的对应的静态文件所在的目录,后面又讲会在classpath路径下的resources目录(要自建),static目录(已建),public目录(要自建)下读取静态文件!!
总结:(静态资源放在哪)
resources/META-INF/resources/webjars/ (在webjar官网copy的maven依赖文件所产生的静态文件)
resources/public/
resources/resources/
resources/static/ (正常我们将静态文件放在static目录下)