SpringBoot webmvc 相关配置的2种方式

SpringBoot webmvc 相关配置的2种方式

前言

SpringBoot 关于webMvc的自动配置类是 WebMvcAutoConfiguration 至于他是在哪里被调用的,我们以后再来分析.

解析

  • WebMvcAutoConfiguration
@Configuration
@ConditionalOnWebApplication
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class,
        WebMvcConfigurerAdapter.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,
        ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
    ......
}

注意 @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) 它表示如果beanFactory中如果已存在WebMvcConfigurationSupport类型的bean,则该类不会被初始化。也就是说我们可以继承
WebMvcConfigurationSupport 来实现自定义web MVC配置。

@Configuration
@Import(EnableWebMvcConfiguration.class)
@EnableConfigurationProperties({ WebMvcProperties.class, ResourceProperties.class })
public static class WebMvcAutoConfigurationAdapter extends WebMvcConfigurerAdapter {
    ......
}

@Configuration
public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration {
    ......
}

WebMvcAutoConfiguration 中有2个子类 WebMvcAutoConfigurationAdapter 和 EnableWebMvcConfiguration 。

  • WebMvcAutoConfigurationAdapter 导入了 EnableWebMvcConfiguration 类、继承 WebMvcConfigurerAdapter 重写了一些方法,并提供了properties文件或yml文件配置功能。

  • EnableWebMvcConfiguration 继承自 DelegatingWebMvcConfiguration。我们来看下这个类

@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {

    private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();

    @Autowired(required = false)
    public void setConfigurers(List<WebMvcConfigurer> configurers) {
        if (!CollectionUtils.isEmpty(configurers)) {
            this.configurers.addWebMvcConfigurers(configurers);
        }
    }
    @Override
    protected void configurePathMatch(PathMatchConfigurer configurer) {
        this.configurers.configurePathMatch(configurer);
    }
    ......
}

我们可以看到 DelegatingWebMvcConfiguration 继承自 WebMvcConfigurationSupport 并包含一个变量 WebMvcConfigurerComposite ,DelegatingWebMvcConfiguration 重写的所有方法都会调用 WebMvcConfigurerComposite 的对应方法来处理,我们来看下这个类

class WebMvcConfigurerComposite implements WebMvcConfigurer {

    private final List<WebMvcConfigurer> delegates = new ArrayList<WebMvcConfigurer>();


    public void addWebMvcConfigurers(List<WebMvcConfigurer> configurers) {
        if (!CollectionUtils.isEmpty(configurers)) {
            this.delegates.addAll(configurers);
        }
    }
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        for (WebMvcConfigurer delegate : this.delegates) {
            delegate.configurePathMatch(configurer);
        }
    }
    ......
}

我们可以看出 WebMvcConfigurerComposite 其实是个分发器,它会将自身的所有方法分发给变量delegates 中的每个 WebMvcConfigurer 来处理。在DelegatingWebMvcConfiguration 中我们可以看到delegates 变量由setConfigurers(List< WebMvcConfigurer > configurers)方法注入,该方法会将factoryBean中所有实现WebMvcConfigurer 接口的类注入到WebMvcConfigurerComposite 中。

由此我们可以得出另一种配置方法,实现WebMvcConfigurer 接口。

总结

配置webmvc的2中方式:

  • 继承 WebMvcConfigurationSupport 类 重写对应方法

  • 实现 WebMvcConfigurer 接口 (WebMvcConfigurerAdapter 抽象类在 5.1.0版本中已废弃,直接实现WebMvcConfigurer 接口就可以了)

注意:

  • 继承 WebMvcConfigurationSupport 会导致 WebMvcAutoConfiguration 不会被初始化,那么该类中实现的properties文件或yml文件配置方式和实现WebMvcConfigurer 接口的配置方式将会失效。除非自定的WebMvcConfigurationSupport 子类中也提供这些功能。

由此我们可以看出其实web MVC的主要配置类是 WebMvcConfigurationSupport ,WebMvcConfigurer 接口如果没有WebMvcConfigurationSupport 的调用也是无法生效的。下一篇我们来深入了解下WebMvcConfigurationSupport 这个类。

猜你喜欢

转载自blog.csdn.net/JavaWorld_hello/article/details/81478867