springboot为我们提供了springmvc的自动配置,所以我们可以直接编写逻辑就能实现功能。(如下内容都是基于springboot2.2.5)
比如万能的helloworld:
我们只要写一个controller就能自动映射到。
访问localhost:8080/hello,如下
那么springboot是如何帮助我们自动配置的呢?
springboot对mvc的自动配置
对于springmvc的自动配置全部在WebMvcAutoConfiguration.class类中。
ctrl+n搜索类,进入:
对静态资源的自动配置
看到如下关键方法:
webjars
首先webjars是什么呢?
看官网的描述:
其实说白了,就是讲静态资源通过jar包的方式导入进来。
那么我们看看springboot是如何配置webjars的。
if (!registry.hasMappingForPattern("/webjars/**")) {
customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/")
.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
关于webjars,会自动帮我们添加一个映射。对于/webjars/**这样的资源回去类路径下的?META-INF/resources/webjars/路径下面去找。并且可以设置缓存时间,而缓存时间是从ResourceProperties下面去找的。
关于ResourcesProperties我们可以从配置文件的spring.resources前缀的属性注入进来。
这样在浏览器访问localhost:8080/webjars/**这个路径就会通过根路径的respurces/webjars/**这个路径来寻找。
比如:我们导入jquery的一个jar包:
只要导入进来,我们就可以通过访问localhost:8080/webjars/jquery/3.3.1/jquery.js来访问了,如下图所示:
静态资源的位置配置
那么我们编写的静态资源应该放到哪里才可以被访问到呢,比如下面的ilogin.html
再来看springboot的自动配置:
那我们点进去看一下这是给我们配置到哪里去了呢?
经过一路跟踪,终于找到,springboot为我们自动配置的静态资源位置是如下几个:classpath:/MATA-INF/resources/、classpath:/resources/、classpath:/public/、classpath:/static/这几个位置,无论我们把静态资源放到这几个的哪一个都可以访问到:
通过测试abcd四个html都能被访问到。
欢迎页的配置
对于欢迎页的配置,springboot又是如何自动配置的呢?
还是进入WebMvcAutoConfiguration.class这个类:
进入这个构造方法里边,
观察这个类的注释:支持静态资源和模板文件,但是更喜欢静态资源。
也就是我们无论是吧index.html页面放到静态资源文件夹下,还是放在templates文件夹下都可以被访问到,但是如果两个路径下都包括index.html,那么优先加载静态资源下的index。
全面接管springmvc
如何全面接管springmvc呢,我们只要在一个组件上面加上@EnableWebMvc注解就行。
这样springboot为我们做的mvc自动配置全部都会失效,只会保留最初始的功能。
如下所示:
这样如果我们在访问webjars,比如:http://localhost:8080/webjars/jquery/3.3.1/jquery.js
就不能访问到了。
为什么只要添加一个注解就不能访问到了呢?
可以进这个注解看一下:
这个注解很简单,就是向容器中导入了一个组件,那我们点进去看一下:
我们可以看到这个类继承了WrbConfigurationSupport这个类,再看看mvc的自动配置类:
mvc的自动配置类会判断在没有这个组件的情况下,才会生效
也就是说我们使用了这个@EnableWebMvc注解,就会使springboot自动配置的mvc失效。