一 .概述
在springboot之中开发一个web项目是十分的简单的,我们本节就看一下springboot之中mvc的自动配置原理,这样可以帮助我们在后面覆盖springboot的默认的配置信息.
二 .springboot的mvc自动配置
下面就是springboot的webMVC的自动配置类,我们首先分析一下主要的结构问题.
@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 {
[1]是一个配置类
[2]需要在web环境下生效
[3]在类路径下需要有Servlet.class,DispatcherServlet.class,WebMvcConfigurerAdapter.class
[4]在容器之中没有WebMvcConfigurationSupport的bean
[5]本类是在DispatcherServletAutoConfiguration和ValidationAutoConfiguration自动配置之后进行的.
???@Bean ???@ConditionalOnMissingBean(HiddenHttpMethodFilter.class) ???public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() { ???????return new OrderedHiddenHttpMethodFilter(); ???}
首先,我们看到,springboot为我们提哦给你了一个Rest过滤器,这个比较简单.
@Configuration ???@Import(EnableWebMvcConfiguration.class) ???@EnableConfigurationProperties({ WebMvcProperties.class, ResourceProperties.class }) ???public static class WebMvcAutoConfigurationAdapter extends WebMvcConfigurerAdapter {
这个就是mvc部分的核心配置了.
首先我们发现就是给我们添加了一个EnableWebMvcConfiguration配置类,然后帮助我们映射了WebMvcProperties和ResourceProperties的属性配置对象.
通过这里,我们就知道了mvc的配置主要集中在WebMvcProperties这个属性的配置之中.
下面我们看看具体的配置:
@Bean ???????@ConditionalOnMissingBean ???????public InternalResourceViewResolver defaultViewResolver() { ???????????InternalResourceViewResolver resolver = new InternalResourceViewResolver(); ???????????resolver.setPrefix(this.mvcProperties.getView().getPrefix()); ???????????resolver.setSuffix(this.mvcProperties.getView().getSuffix()); ???????????return resolver; ???????} ???????@Bean ???????@ConditionalOnBean(View.class) ???????@ConditionalOnMissingBean ???????public BeanNameViewResolver beanNameViewResolver() { ???????????BeanNameViewResolver resolver = new BeanNameViewResolver(); ???????????resolver.setOrder(Ordered.LOWEST_PRECEDENCE - 10); ???????????return resolver; ???????} ???????@Bean ???????@ConditionalOnBean(ViewResolver.class) ???????@ConditionalOnMissingBean(name = "viewResolver", value = ContentNegotiatingViewResolver.class) ???????public ContentNegotiatingViewResolver viewResolver(BeanFactory beanFactory) { ???????????ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver(); ???????????resolver.setContentNegotiationManager( ???????????????????beanFactory.getBean(ContentNegotiationManager.class)); ???????????// ContentNegotiatingViewResolver uses all the other view resolvers to locate ???????????// a view so it should have a high precedence ???????????resolver.setOrder(Ordered.HIGHEST_PRECEDENCE); ???????????return resolver; ???????}
在上面,我们可以看到springboot为我们提供了三个视图解析器.
@Bean ???????@ConditionalOnProperty(prefix = "spring.mvc", name = "date-format") ???????public Formatter<Date> dateFormatter() { ???????????return new DateFormatter(this.mvcProperties.getDateFormat()); ???????}
为我们提供了一个日期格式化的格式化器,可以通过spring.mvc.data-formar进行配置.
@Bean ???????public WelcomePageHandlerMapping welcomePageHandlerMapping( ???????????????ResourceProperties resourceProperties) { ???????????return new WelcomePageHandlerMapping(resourceProperties.getWelcomePage(), ???????????????????this.mvcProperties.getStaticPathPattern()); ???????}
为我们配置了一个欢迎页的处理器映射器.我们发现就是默认的index.html页面.
@Configuration ???????@ConditionalOnProperty(value = "spring.mvc.favicon.enabled", matchIfMissing = true) ???????public static class FaviconConfiguration {
为我们提供了一个/favicon.ico的网站图标的映射.
等等,这些都是springboot为我们提供的.
我们最终发现实际上就是帮助我们配置了一个WebMvcConfigurer的bean.
三 .WebMvcConfigurer的作用
在springboot之中,使用了WebMvcConfigurer帮助我们覆盖我们的默认配置.
我们可以向容器之中添加一个WebMvcConfigurer组件,这样springboot会将默认的配置和我们的配置进行组合,然后成为springboot最终的配置.
由于WebMvcConfigurer是一个接口,因此我们常常添加的是一个WebMvcConfigurer的适配器类WebMvcConfigurerAdapter.
public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer { ???@Override ???public void configurePathMatch(PathMatchConfigurer configurer) { ???} ???@Override ???public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { ???} // 配置异步支持 ???@Override ???public void configureAsyncSupport(AsyncSupportConfigurer configurer) { ???} // 配置默认的路径映射 ???@Override ???public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { ???} // 可以添加一些formatter ???@Override ???public void addFormatters(FormatterRegistry registry) { ???} //可以添加一些拦截器 ???@Override ???public void addInterceptors(InterceptorRegistry registry) { ???} // 可以添加一些资源处理器 ???@Override ???public void addResourceHandlers(ResourceHandlerRegistry registry) { ???} ??//可以添加一些跨域映射 ???@Override ???public void addCorsMappings(CorsRegistry registry) { ???} // 添加视图控制器 ???@Override ???public void addViewControllers(ViewControllerRegistry registry) { ???} ? //配置视图解析器 ???@Override ???public void configureViewResolvers(ViewResolverRegistry registry) { ???} ???@Override ???public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { ???} ?????@Override ???public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) { ???} ??//添加消息转换器 ???@Override ???public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { ???} ?????@Override ???public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { ???} ????@Override ???public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) { ???} //添加异常处理器 ???@Override ???public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) { ???} ??//添加校验器 ???@Override ???public Validator getValidator() { ???????return null; ???} ???@Override ???public MessageCodesResolver getMessageCodesResolver() { ???????return null; ???}}
四 .mvc的自定义配置
[1]现在我们知道了mvc的自定义的配置方法,就是向容器之中加入一个bean,然后springboot在配置的时候就会加入我们的配置.
[2]使用WebMvcConfigurer来统一的进行配置.
008 WEBmvc的自动配置
原文地址:https://www.cnblogs.com/trekxu/p/9739727.html