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 这个类。