SpringBoot只WebMvcConfigurationSupport与WebMvcConfigurer

查看源码注释上查到的解释是,在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,以便自定义提供的配置。

发布了34 篇原创文章 · 获赞 33 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/u010565545/article/details/104551267