SpringBoot之WebMvcConfigurationSupport与WebMvcConfigurer

本文深入解析Spring MVC配置的三种方式:继承WebMvcConfigurationSupport、WebMvcConfigurerAdapter(已过时)及实现WebMvcConfigurer接口。探讨了各配置方式的安全性与灵活性,以及@EnableWebMvc注解的作用与使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查看源码注释上查到的解释是,在spring中配置WebMvc时有两种方法,

1.继承WebMvcConfigurationSupport或者子类DelegatingWebMVcconfiguration,重写里面相应的方法

2.继承WebMvcConfigurer的子抽象类WebMvcConfigurerAdapter(已经过时了),也是重写里面相应的方法,但是需要在配置类上添加@EnableWebMvc注解。那这两个类直接是什么关系呢?

3.实现WebMvcConfigurer(因为2已经过时了),也是重写里面相应的方法,但是需要在配置类上添加@EnableWebMvc注解

  细心的开发者会发现,WebMvcConfigurationSupport中那些子类可以重写的空方法在WebMvcConfigurer都有,这说明WebMvcConfigurer只是WebMvcConfigurationSupport的一个扩展类它并没有扩展新功能,只是为让用户更方便安全的添加自定义配置,为什么说是安全呢?

因为如果直接继承WebMvcConfigurationSupport,那么用户可以重写默认的配置,如果对原理不是很清楚地开发者不小心重写了默认的配置,springmvc可能相关功能就无法生效,是一种不安全的行为。但如果是继承WebMvcConfigurerAdapter,那么开发者是在默认配置的基础上添加自定义配置,相对来说更安全一些,只不过要多加一个@EnableWebMvc注解。从这个角度来说,最佳实践还是继承WebMvcConfigurerAdapter,如下

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //添加自定义拦截器
        registry.addInterceptor();
    }
}

网上说WebMvcConfigurerAdapter已经标记为过时

    1. 为什么WebMvcConfigurer实现要加@EnableWebMvc
        @EnableWebMvc注解类上导入了DelegatingWebMvcConfiguration类,该类是WebMvcConfigurationSupport的子类该类除了实例化WebMvcConfigurationSupport实例以外,另一个作用就是收集BeanFactory中所有WebMvcConfigurer的实现汇集到WebMvcConfigurerComposite中,在WebMvcConfigurationSupport实例化过程会分别调用这些实现,将相应的实例传入这些实现中,供开发者在此基础上添加自定义的配置。这也就是在WebMvcConfigurerAdapter子类上要加@EnableWebMvc的原因,因为要先实例化WebMvcConfigurationSupport

    2. 为什么可以存在多个WebMvcConfigurer的实现?
        一般来讲一个应用中一个WebMvcConfigurer的已经足够,设计成收集多个是不是有些多余?从springboot的autoconfigure机制来看并不多余,反而更灵活,比如我要写一个mybatis的AutoConfiguration和JPA的AutoConfiguration,我就可以在不同的AutoConfiguration里面定义一个WebMvcConfigurer的实现,里面只配置与mybatis或JPA相关的配置,这样需要那个启用那个,不需要人工通过注释代码来转换mybatis和JPA,

      注意:

1. 在springboot下自定义的WebMvcConfigurer实现配置类谨慎添加@EnableWebMvc的,因为springboot已经实                     例 化了WebMvcConfigurationSupport,如果添加了该注解,默认的WebMvcConfigurationSupport配置类是不会生效                     的,也就是以用户定义的为主,一般建议还是不覆盖默认的好。

   如果 WebMvcConfigurer没有公开一些需要配置的更高级的设置,请考虑删除@EnableWebMvc注解,并直接继承WebMVcconfigurationSupport 或delegatingWebMVcconfiguration 类来扩展

2.只有一个@Configuration配置类可以有@EnableWebMvc(有且仅有一个)注解来导入SpringWebMvc 配置。但是,可以有多个@Configuration}配置类实现 WebMvcConfigurer,以便自定义提供的配置。

 

Spring Boot提供了多种方法来解决跨域问题,其中之一是通过实现WebMvcConfigurer接口来自定义处理器、拦截器、视图解析器、转换器以及设置跨域等。 具体而言,可以通过实现WebMvcConfigurer接口来配置跨域。其中,configureDefaultServletHandling方法是用来配置默认的Servlet处理,可以使用DefaultServletHandlerConfigurer的enable方法来开启默认的Servlet处理器,这样可以处理静态资源请求。另外,也可以通过enable方法指定默认的Servlet名称。 除了实现WebMvcConfigurer接口,还可以继承WebMvcConfigurationSupport类来实现定制化的配置。这个类提供了更加灵活的配置选项。 总结起来,通过实现WebMvcConfigurer接口或继承WebMvcConfigurationSupport类可以在Spring Boot中实现跨域功能。具体的配置方法可以根据实际需求选择适合的方式来进行配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [SpringBoot配置接口:WebMvcConfigurer](https://blog.csdn.net/JokerLJG/article/details/123224002)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [【springboot】--跨域问题及webMvcConfigurer介绍](https://blog.csdn.net/xunmengyou1990/article/details/124557829)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sh_c_1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值