WebMvcConfigurerAdapter 与 WebMvcConfigurationSupport 的区别:
关于这块的区别,网上的说法都不太明朗,至此来说明一下
spring 5.0 之前,配置类继承
WebMvcConfigurerAdapter
,如果加@EnableWebMvc
注解,则为全面接管SpringMVC,否则为自定义扩展配置spring 5.0 之后,全面接管SpringMVC,需要继承
WebMvcConfigurationSupport
,而自定义扩展配置则需要实现WebMvcConfigurer
接口在自定义扩展配置 这块,为什么 实现
WebMvcConfigurer
接口 取代了 继承WebMvcConfigurerAdapter
的方式?:在java8推出接口default方法之后,WebMvcConfigurerAdapter中的空方法可以直接定义default方法在WebMvcConfigurer,
所以可以省略WebMvcConfigurerAdapter,通过将自定义配置类实现WebMvcConfigurer接口来实现同样的功能
WebMvcConfigurerAdapter
在Spring5中已被弃用,官方推荐直接实现WebMvcConfigurer
至于 什么是 全面接管SpringMVC、什么是 自定义扩展配置,请看如下代码示例:
1、全面接管SpringMVC:
方式一:Spring 5.0之前
配置类继承WebMvcConfigurerAdapter
,且注解@EnableWebMvc
注:@EnableWebMvc
注解说明:
如果加上
@EnableWebMvc
注解,则被注解的自定义配置类将全面接管SpringMVC
,且SpringMVC的所有自动配置都将失效(包括静态资源映射等,不推荐)如果不加,则保留了所有的自动配置,也能用自定义扩展的配置
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
//视图映射
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// super.addViewControllers(registry);
//添加视图映射规则: 请求地址 请求页面
registry.addViewController("/").setViewName("index");
}
//自定义拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/index.html","/","/login");
}
}
方式二:Spring 5.0之后
直接继承WebMvcConfigurationSupport
:
@Configuration
public class WebMvcConfg extends WebMvcConfigurationSupport {
//do something
//重写静态资源映射方法,否则静态资源映射不了
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/resources/")
.addResourceLocations("classpath:/static/")
.addResourceLocations("classpath:/public/");
super.addResourceHandlers(registry);
}
//定义拦截器 方式一
//@Bean
//LoginHandlerInterceptor loginHandlerInterceptor(){
//return new LoginHandlerInterceptor();
//}
//定义拦截器 方式二
//@Resource
//private LoginHandlerInterceptor loginHandlerInterceptor;
//拦截器配置
@Override
public void addInterceptors(InterceptorRegistry registry){
// 注册拦截器 //addInterceptor()中:方式1 写loginHandlerInterceptor() 方式2写loginHandlerInterceptor
InterceptorRegistration ir = registry.addInterceptor(new LoginHandlerInterceptor());//方式3直接new
// 配置拦截的路径
ir.addPathPatterns("/**");
// 配置不拦截的路径
ir.excludePathPatterns("/error") ;
super.addInterceptors(registry);
// 还可以在这里注册其它的拦截器
//registry.addInterceptor(new OtherInterceptor()) .addPathPatterns("/**");
}
}
注:
一个项目中只能存在一个 WebMvcConfigurationSupport
自定义转化器必须重写WebMvcConfigurationSupport 的 configureMessageConverters方法
WebMvcConfigurationSupport与WebMvcConfigurerAdapter的区别:
直接继承WebMvcConfigurationSupport,那么用户可以重写默认的配置,如果不小心重写了默认的配置,springmvc可能相关功能就无法生效,是一种不安全的行为
继承WebMvcConfigurerAdapter,那么开发者是在默认配置的基础上添加自定义配置,相对来说更安全一些,只不过要多加一个@EnableWebMvc注解
2、自定义扩展配置的方式:
方式一:Spring 5.0之前
继承WebMvcConfigurerAdapter
需要按下ctrl+o
选择可重写的方法
//使用WebMvcConfigurerAdapter(MVC配置适配器)扩展SpringMVC的功能
@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {
//视图映射
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// super.addViewControllers(registry);
//添加视图映射规则: 请求地址 请求页面
registry.addViewController("/").setViewName("index");
}
//或:在容器中注册一个组件
@Bean //将组件注册在容器
public WebMvcConfigurerAdapter webMvcConfigurerAdapter(){
WebMvcConfigurerAdapter adapter = new WebMvcConfigurerAdapter() {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
}
//注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
//super.addInterceptors(registry);
//静态资源; *.css , *.js
//SpringBoot已经做好了静态资源映射
// registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
// .excludePathPatterns("/index.html","/","/user/login");
}
};
return adapter;
}
}
方式二:Spring 5.0之后
WebMvcConfigurerAdapter
在Spring5中已被弃用,官方推荐直接实现WebMvcConfigurer
@Configuration
public class WebMvcConfg implements WebMvcConfigurer {
//添加视图映射 重写方法
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// super.addViewControllers(registry);
//添加视图映射规则: 请求地址 请求页面
registry.addViewController("/").setViewName("index");
}
//定义拦截器 方式一
//@Bean
//LoginHandlerInterceptor loginHandlerInterceptor(){
//return new LoginHandlerInterceptor();
//}
//定义拦截器 方式二
//@Resource
//private LoginHandlerInterceptor loginHandlerInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册拦截器 //addInterceptor()中:方式1 写loginHandlerInterceptor() 方式2写loginHandlerInterceptor
registry.addInterceptor(new LoginHandlerInterceptor()) //方式3直接 new LoginHandlerInterceptor()
//配置拦截的路径
.addPathPatterns("/**")
//配置不拦截的路径
.excludePathPatterns("/","/index.html", "/login");
}
}
注:
WebMvcConfigurer与WebMvcConfigurerAdapter的关系:
WebMvcConfigurerAdapter是WebMvcConfigurer的子抽象类