WebMvcConfigurationSupport配置加载的原理

WebMvcConfigurationSupport 的配置由 DelegatingWebMvcConfiguration 来进行加载, 因为它有@Configuration注解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
...
@Autowired(required = false) // 1
public void setConfigurers(List<WebMvcConfigurer> configurers) {
if (!CollectionUtils.isEmpty(configurers)) {
this.configurers.addWebMvcConfigurers(configurers);
}
}
...

@Override // 2
protected void addInterceptors(InterceptorRegistry registry) {
this.configurers.addInterceptors(registry);
}


}

  1. setConfigurers方法在spring DI的时候被执行, 然后将所有实现WebMvcConfigurer接口的方法加入到configures中; WebMvcConfigurerAdapter实现了WebMvcConfigurer接口.
  2. 调用addInterceptors(初始化HandlerMapping, 添加拦截器时会触发). 通过代理给configures对象来完成add操作, configures会代理给所有的配置类.

注意:

  • configures是一个WebMvcConfigurerComposite的一个实例, 内部有一个delegates数组, 用来存放所有的WebMvc配置Bean
  • 通过这种方式, 使得使用者可以定义任意多的WebMvcConfigurerAdapter(不一定是他, 也有可能是WebMvcConfigurer的其他子类), 当某项操作需要用到configures的时候, 则会代理configures调用相应的配置方法. 如在配置拦截器的时候轮询调用所有的addInterceptors方法为registry添加新的拦截器.
0%