Spring Boot 会因为引用web配置,创建一个资源处理器,这个资源处理器把相对于Classpath根目录的
/static
/public
/resources
/META-INF/resources
里的静态内容提供出来。
本人理解:
spring boot 创建的maven项目的classpath 指的是src-main下的目录文件名称,每创建一个文件夹,classpath都会增加一个。
原因:
WebMvcAutoConfiguration里会添加
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
"classpath:/META-INF/resources/", "classpath:/resources/",
"classpath:/static/", "classpath:/public/" };
进一步看代码,下面的程序块会被添加到:ResourceHandlerRegistry
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!registry.hasMappingForPattern("/webjars/**")) {
registry.addResourceHandler("/webjars/**").addResourceLocations(
"classpath:/META-INF/resources/webjars/");
}
if (!registry.hasMappingForPattern("/**")) {
registry.addResourceHandler("/**").addResourceLocations(
RESOURCE_LOCATIONS);
}
}
注意:如果在@Configuration配置类里添加@EnableWebMvc,WebMvcAutoConfiguration里的配置将会失效,你必须逐一配置。
网上很多例子直接写了该注解,如果不是作者本意,那么很多配置都要自己重新配置了。
如果需要添加映射目录,需要定义WebMvcConfigurer接口的实现类。spring 5x和spring boot 2x 废弃了WebMvcConfigurerAdapter。
@Configuration
public class MyWebMvcConfg implements WebMvcConfigurer {
//todo
}
添加某一目录:
如果你想增加如/mystatic/**映射到classpath:/mystatic/,你可以让你的配置类实现WebMvcConfigurer,然后重写如下方法:
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/mystatic/**")
.addResourceLocations("classpath:/mystatic/");
}
网上一些人的心得:
https://www.cnblogs.com/chen110xi/p/6198497.html
这个说的非常好,很清晰。
网友评论