008 WEBmvc的自动配置

一 .概述

  在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来统一的进行配置.

原文地址:https://www.cnblogs.com/trekxu/p/9739727.html

时间: 2024-10-26 03:08:41

008 WEBmvc的自动配置的相关文章

win7设置固定IP重启后无法上网,ipconfig显示为自动配置IPV4 169.254的地址

近日安装原版Win7系统打完网卡驱动补丁后,给电脑设置了固定的IP地址后一切正常,但是电脑重启后发现上不了网了,右下角网络图标有个感叹号,打开网络和共享中心-->本地连接-->详细信息-->发现IPv4的地址与ipconfig /all得到的IP地址一致,均显示为:自动配置IPv4地址:169.254.123.188(首选) 但是查看本地连接-->属性里看到之前设置的固定IP地址是没有问题的, 所以想到了应该是电脑启用了自动配置IPv4功能,导致了固定IP无法分配给电脑, 尝试用命

一个由于springboot自动配置所产生的问题的解决

由于我的项目里面需要使用到solr,我做了一下solr和springboot的整合,结果启动项目的时候,就报错了...报错的信息的第一行提示如下: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'solrClient' defined in class path resource [org/springframework/boot/autoconfigure/solr/

网络连接详细信息出现两个自动配置ipv4地址

  问题:网络连接详细信息出现两个自动配置ipv4地址,一个是有效地址,一个是无效地址.   解决办法:先将本地连接ip设置成自动获取,然后点击开始-->运行-->输入cmd,回车,进入命令行界面,输入ipconfig  /release回车,然后输入ipconfig  /renew,然后等待ip更新,一般到这里问题已经解决,然后再设置静态ip就行了.

Java环境变量自动配置。嗯,就是用C#去配置JDK

在跟学弟们聊天的过程中,发现一些人在首次接触Java时,对环境变量配置总是很生疏.可能是由于初学,对一些概念没有很深刻的理解.本着助人为乐的精神.我决定帮他们一下.写一个自动配置JDK环境变量的小工具. 其实,整个过程的逻辑并不难: 1.找到jdk的安装路径(默认为C:\Program Files\Java\jdkxxx,xxx指版本号字符串). 2.在环境变量中添加 JAVA_HOME 变量,用于标记jdk路径,在下面的步骤中会用到,其值为 第1步中找到的jdk文件夹路径. 3.在环境变量中添

huhamhire-hosts — Hosts文件自动配置工具

https://www.anotherhome.net/1376 推荐配合EasyGoAgent使用: EasyGoAgent — 开箱即用的GoAgent Update 2015.5.15 数据文件V1.5.7已更新, 数据包下载:http://pan.baidu.com/s/1mgrExrM (感谢网友zzd911) Update 2015.4.1 数据文件V1.5.6已更新, 数据包下载:http://pan.baidu.com/s/1qWqOtUO Update 2015.2.4 数据文

[win]AD域组策略wifi自动配置

http://wenku.baidu.com/link?url=MC950wliAZNeVUJ2M6Y1VTi5faqo7kG374fyBjW57r0qyLJkBZLg5ypiql4RFywQ8q7yfdjr5nQMdvolCvNv6RBkogAmcibH0QHAr1NXklG 802.1x认证AD域自动下发客户端配置指导书 这篇文档不再描述radius 服务器和AD 域的搭建过程,只说明通过域下发802.1X客户端配置(即对域的配置过程) 适用的服务器:Win Server2008 radiu

自定义PAC文件实现代理自动配置

首先了解什么是PAC文件,点击了解详情. 在了解了PAC文件之后,那么后面的事情就比较简单了. 按照规范编写出适合自己的PAC文件,让网络更为自由(作为开发人员已被逼上不归路了)! 需要的朋友点击下载(下载完后打开文件修改对应的端口值) 代理工具集点击下载 下面以GoAgentX为例说明使用方法: 选择完后,记得点击下面的"Restart PAC Server"按钮进行立即生效: 选择适当的模式: 一般下图的网络配置是自动配置的: 自定义PAC文件实现代理自动配置,布布扣,bubuko

代理自动配置脚本

iefile://d:/PersonalSet/agent.pac火狐file:///d:/PersonalSet/agent.pac function FindProxyForURL(url, host){ if (isPlainHostName(host)) {     return "DIRECT"; } if (isInNet(host, "10.0.0.0", "255.0.0.0")) {     return "DIREC

自动配置IPv4问题

对于 Windows , 配置 IP,如: 192.168.1.101, 如果这个 IP 已经在局域网内存在,那么将会提示局域网内已经存在该 IP. 而这个时候,Windows 7 将产生一个 “自动配置IPv4地址”,如:169.254.255.44. 这个时候,使用 ping 命令,将提示从 169.254.255.44 返回不可达错误,而非提示从 192.168.1.101 返回不可达错误. 解决该问题方法: 重新配置IP,这个 IP 需要在局域网内目前无人使用.