源码分析 WebMvcAutoConfiguration 类
在WebMvcAutoConfiguration找到viewResolver()
ContentNegotiatingViewResolver()内容协商视图解析器,自动配置了viewResolver(),点击查看源码
@Nullable //说明参数可为空
public View resolveViewName(String viewName, Locale locale) throws Exception {
RequestAttributes attrs = RequestContextHolder.getRequestAttributes();
Assert.state(attrs instanceof ServletRequestAttributes, "No current ServletRequestAttributes");
List<MediaType> requestedMediaTypes = this.getMediaTypes(((ServletRequestAttributes)attrs).getRequest());
if (requestedMediaTypes != null) {
//获取候选的视图解析器
List<View> candidateViews = this.getCandidateViews(viewName, locale, requestedMediaTypes);
//选择最合适的视图解析器并返回
View bestView = this.getBestView(candidateViews, requestedMediaTypes, attrs);
if (bestView != null) {
return bestView;
}
}
查看getCandidateViews()源码可知道,它是用循环将视图器挨个解析
所以ContentNegotiatingViewResolver 是用来组合所有视图解析器的
继续分析
WebMvcAutoConfiguration 是 SpringMVC的自动配置类,里面有一个类WebMvcAutoConfigurationAdapter, 这个类上有一个注解,在做其他自动配置时会导入:@Import(EnableWebMvcConfiguration.class),就会调用所有的WebMvcConfiguration,包括自定义的。
全面接管SpringMVC
全面接管即:SpringBoot对SpringMVC的自动配置不需要了,所有都是我们自己去配置。
只需在我们的配置类中要加一个@EnableWebMvc,但是加上注解所有的自动配置都会失效.
导入了DelegatingWebMvcConfiguration类
进去查看源码,发现集成继承了WebMvcConfigurationSupport
再回来看MVC自动配置
@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
//容器中没有这个组件的时候,自动配置生效
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {}
总结
@EnableWebMvc将WebMvcConfigurationSupport组件导入进来了,而导入的等待WebMvcConfigurationSupport只是SpringMVC最基本的功能