1、前言
Spring Boot 抛弃了传统 xml 配置文件,通过配置类(标注 @Configuration 的类,相当于一个 xml 配置文件)以 JavaBean 形式进行相关配置。
Spring Boot 对 Spring MVC 的自动配置可以满足我们的大部分需求,但是我们也可以通过自定义配置类(标注 @Configuration 的类)并实现 WebMvcConfigurer 接口来定制 Spring MVC 配置,例如拦截器、格式化程序、视图控制器等等。
2、定制 Spring MVC 配置
SpringBoot 1.5 及以前是通过继承 WebMvcConfigurerAdapter 抽象类来定制 Spring MVC 配置的,但在 SpringBoot 2.0 后,WebMvcConfigurerAdapter 抽象类就被弃用了,改为实现 WebMvcConfigurer 接口来定制 Spring MvVC 配置。
WebMvcConfigurer 是一个基于 Java 8 的接口,该接口定义了许多与 Spring MVC 相关的方法,其中大部分方法都是 default 类型的,且都是空实现。因此我们只需要定义一个配置类实现 WebMvcConfigurer 接口,并重写相应的方法便可以定制 Spring MVC 的配置。
在 Spring Boot 项目中,我们可以通过以下 2 中形式定制 Spring MVC:
- 扩展 Spring MVC
- 全面接管 Spring MVC
下面,我们分别对这两种定制 Spring MVC 的形式进行介绍。
1、扩展 Spring MVC
如果 Spring Boot 对 Spring MVC 的自动配置不能满足我们的需要,我们还可以通过自定义一个 WebMvcConfigurer 类型(实现 WebMvcConfigurer 接口)的配置类(标注 @Configuration,但不标注 @EnableWebMvc 注解的类),来扩展 Spring MVC。这样不但能够保留 Spring Boot 对 Spring MVC 的自动配置,享受 Spring Boot 自动配置带来的便利,还能额外增加自定义的 Spring MVC 配置。
示例 1
1、创建一个名为 spring-boot-adminex 的 Spring Boot 项目,并将后台管理系统 AdminEx 中的 css、fonts、images 和 js 目录及其中的静态资源,移动到该项目的 src/main/resources/static 下,目录结构如下图。
2、在 net.biancheng.www.config 包下,创建一个名为 MyMvcConfig 的配置类并实现 WebMvcConfigurer 接口,重写 addViewControllers() 方法,代码如下。
package net.biancheng.www.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
//实现 WebMvcConfigurer 接口可以来扩展 SpringMVC 的功能
//@EnableWebMvc 不要接管SpringMVC
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//当访问 “/” 或 “/index.html” 时,都直接跳转到登陆页面
registry.addViewController(“/”).setViewName(“login”);
registry.addViewController(“/index.html”).setViewName(“login”);
}
}
3、在 net.biancheng.www.controller 下创建一个名为 IndexController 的 Controller,代码如下。
package net.biancheng.www.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class IndexController {
/**
* 跳转到登陆页面
* @return
*/
@GetMapping(value = {“/login”})
public String loginPage() {
//跳转到登录页 login.html
return “login”;
}
}
4、将 AdminEx 中的 login.html(登录页)移动到 src/main/resources/templates 下,结构如下图。
图2:login.html
5、启动 Spring Boot,您会发现“http://localhost:8080/login”、“http://localhost:8080/”、“http://localhost:8080/index.html”3 个 URL 都能跳转到登陆页 login.html,结果如下图。
图3:登陆页面
2、全面接管 Spring MVC
在一些特殊情况下,我们可能需要抛弃 Spring Boot 对 Spring MVC 的全部自动配置,完全接管 Spring MVC。此时我们可以自定义一个 WebMvcConfigurer 类型(实现 WebMvcConfigurer 接口)的配置类,并在该类上标注 @EnableWebMvc 注解,来实现完全接管 Spring MVC。
注意:完全接管 Spring MVC 后,Spring Boot 对 Spring MVC 的自动配置将全部失效。
示例 2
1、在 MyMvcConfig 配置类上标注 @EnableWebMvc,除此之外其他文件都不做任何修改,代码如下。
package net.biancheng.www.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
//实现 WebMvcConfigurer 接口可以来扩展 SpringMVC 的功能
@EnableWebMvc // 完全接管SpringMVC
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//当访问 “/” 或 “/index.html” 时,都直接跳转到登陆页面
registry.addViewController(“/”).setViewName(“login”);
registry.addViewController(“/index.html”).setViewName(“login”);
}
}
2、启动 Spring Boot,在浏览器地址栏输入“http://localhost:8080/”访问登录页,结果如下图。
3、浏览器地址栏输入“http://localhost:8080/css/style.css” ,访问 login.html 中引用的 css 样式表,结果如下图。
全面接管 Spring mvc 静态资源失效
我们知道,Spring Boot 能够访问位于静态资源文件夹中的静态文件,这是在 Spring Boot 对 Spring MVC 的默认自动配置中定义的,当我们全面接管 Spring MVC 后,Spring Boot 对 Spring MVC 的默认配置都会失效,此时再访问静态资源文件夹中的静态资源就会报 404 错误。
加入
QQ群:722461036
微信群:
一起督促、学习、练习、温习、复习 ~ ~ ~