继承 WebMvcConfigurerAdapter 和 WebMvcConfigurationSupport 的区别

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的子抽象类

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值