您当前的位置: 首页 >  spring

white camel

暂无认证

  • 2浏览

    0关注

    442博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

SpringBoot——SpringMVC自动配置原理

white camel 发布时间:2020-04-22 18:41:22 ,浏览量:2

目录
  • 一、SpringMVC自动配置
    • 1、自动配置在Spring的默认值之上添加了以下功能
  • 二、视图解析器
  • 三、转换器和格式化器
  • 四、HttpMessageConverters
  • 五、 扩展SpringMVC
  • 六、全面接管SpringMVC
  • 七、如何修改SpringBoot的默认配置

在这里插入图片描述

一、SpringMVC自动配置

跳转到目录

  • SpringBoot对我们的SpringMVC做了哪些配置,包括如何扩展如何定制。 只有把这些都搞清楚了,我们在之后使用才会更加得心应手。

  • 途径一:源码分析,途径二:官方文档!

  • Spring Boot为Spring MVC提供了自动配置,可与大多数应用程序完美配合。

  • 以下是SpringBoot对SpringMVC的默认配置 org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration

1、自动配置在Spring的默认值之上添加了以下功能

跳转到目录

  • 包含ContentNegotiatingViewResolverBeanNameViewResolver。–> 视图解析器
  • 支持服务静态资源,包括对WebJars的支持(官方文档中有介绍)。–> 静态资源文件夹路径
  • 自动注册ConverterGenericConverterFormatterbeans。–> 转换器,格式化器
  • 支持HttpMessageConverters官方文档中有介绍)。–> SpringMVC用来转换Http请求和响应的;User—JSON;
  • 自动注册MessageCodesResolver官方文档中有介绍)。–> 定义错误代码生成规则
  • 静态index.html支持。–> 静态首页访问
  • 定制Favicon.ioc支持(官方文档中有介绍)。–> 网站图标
  • 自动使用ConfigurableWebBindingInitializerbean官方文档中有介绍)。

如果您想保留 Spring Boot MVC 的功能,并且需要添加其他 MVC配置(拦截器,格式化程序和视图控制器等),可以添加自己的 WebMvcConfigurer类型的 @Configuration 类,但不能带 @EnableWebMvc 注解。如果您想自定义 RequestMappingHandlerMappingRequestMappingHandlerAdapter 或者 ExceptionHandlerExceptionResolver 实例,可以声明一个 WebMvcRegistrationsAdapter 实例来提供这些组件。

如果您想完全掌控 Spring MVC,可以添加自定义注解了 @EnableWebMvc 的 @Configuration 配置类。

二、视图解析器

跳转到目录 视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发?重定向?)

  • 自动配置了ViewResolver
  • ContentNegotiatingViewResolver:组合所有的视图解析器的;

首先进入WebMvcAutoConfiguration配置类, 找到ContentNegotiatingViewResolver 在这里插入图片描述

获取所有的候选视图 在这里插入图片描述 视图解析器从哪里来的呢? 在这里插入图片描述 所以我们可以自己给容器中添加一个视图解析器;通过mvc的自动配置就可以自动的将其组合进来

自定义一个视图解析器,并添加到容器中,mvc会自动将这个视图解析器,添加到候选视图解析器

@SpringBootApplication
public class Springboot04WebApplication {

    public static void main(String[] args) {
        SpringApplication.run(Springboot04WebApplication.class, args);
    }

    @Bean
    public ViewResolver myViewReolver() {
        return new MyViewResolver();
    }

    private static class MyViewResolver implements ViewResolver {
        @Override
        public View resolveViewName(String s, Locale locale) throws Exception {
            return null;
        }
    }
}

所有的请求都会通过DispatcherServletdoDispatch, 可以在这里打个断点, 查看所有的视图解析器; 在这里插入图片描述

三、转换器和格式化器

跳转到目录

  • Converter:转换器; public String hello(User user):类型转换使用Converter(表单数据转为user)
  • Formatter: 格式化器; 2017.12.17===Date;

找到格式化转换器 在这里插入图片描述

点进getDateFormat()方法 在这里插入图片描述 可以看到在我们的XxxProperties文件中,我们可以进行自动配置它! 如果配置了自己的格式化方式,就会注册到Bean中生效,我们可以在配置文件中配置日期格式化的规则: 在这里插入图片描述

添加格式化器 在这里插入图片描述 在这里插入图片描述

也就是说我们自己添加的格式化器转换器, 我们只需要放在容器中即可!

四、HttpMessageConverters

跳转到目录

  • HttpMessageConverter:SpringMVC用来转换Http请求和响应的;User—JSON(将JavaBean 转为 JSON数据);

  • HttpMessageConverters 是从容器中确定;获取所有的HttpMessageConverter;

    自己给容器中添加HttpMessageConverter,只需要将自己的组件注册容器中(@Bean,@Component等注册方式)

五、 扩展SpringMVC

跳转到目录

  • 以前的配置文件中的配置


  • 现在使用SpringBoot的方式来替代上面配置文件中的配置,需要扩展SpringMVC;

现在,编写一个配置类(@Configuration),是WebMvcConfigurer类型;不能标注@EnableWebMvc 既保留了所有的自动配置,也能用我们扩展的配置;

我们要做的就是编写一个@Configuration注解类,并且类型要为WebMvcConfigurer,还不能标注@EnableWebMvc注解; 我们去自己写一个;我们新建一个包叫config,写一个类MyMvcConfig;

// 配置类
@Configuration
// 使用WebMvcConfigurer用来扩展SpringMVC的功能
public class MyMvcConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
    	// 浏览器发送/sunny请求,就会来到test页面(也是通过模板引擎(thymeleaf)解析的)
        registry.addViewController("/sunny").setViewName("test");
    }
}

这样一来, 我们就没必要在写; 通过上面的方式就可以实现视图映射在这里插入图片描述

原理:
  • 我们知道WebMvcAutoConfiguration是SpringMVC的自动配置类
  • 下面这个类是WebMvcAutoConfiguration中的一个内部类 在这里插入图片描述
  • 看一下@Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})中的这个类, 这个类依旧是WebMvcAutoConfiguration中的一个内部类 在这里插入图片描述
  • 重点看一下这个类继承的父类DelegatingWebMvcConfiguration

自动注入,从容器中获取所有的WebMvcConfigurer 在这里插入图片描述

在这里插入图片描述 容器中所有的WebMvcConfigurer都会一起起作用; 我们的配置类也会被调用;

效果:SpringMVC的自动配置和我们的扩展配置都会起作用;

在这里插入图片描述

六、全面接管SpringMVC

跳转到目录

  • SpringBoot对SpringMVC的自动配置不需要了,所有都是由我们自己来配置;所有的SpringMVC的自动配置都失效了

  • 我们只需要在配置类中添加@EnableWebMvc即可; 在这里插入图片描述 在这里插入图片描述

原理:
  • 为什么@EnableWebMvc自动配置就失效了;

  • 我们看一下EnableWebMvc注解类 在这里插入图片描述

  • 重点在于@Import({DelegatingWebMvcConfiguration.class})

  • DelegatingWebMvcConfigurationWebMvcConfigurationSupport的子类 在这里插入图片描述

我们再来看一下springmvc的自动配置类WebMvcAutoConfiguration

在这里插入图片描述 DelegatingWebMvcConfigurationWebMvcConfigurationSupport的子类, 所以整个WebMvcAutoConfiguration配置类都没有生效了!

所以: @EnableWebMvc将WebMvcConfigurationSupport组件导入进来;

而导入的WebMvcConfigurationSupport只是SpringMVC最基本的功能;所以像视图解析器, 格式化器 等都失效了, 需要我们自己手动配置!

七、如何修改SpringBoot的默认配置

跳转到目录 模式:

  • SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean、@Component)如果有就用用户配置的,如果没有,才自动配置;如果有些组件可以有多个(ViewResolver)将用户配置的和自己默认的组合起来;

  • 在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展配置

  • 在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置

关注
打赏
1661428283
查看更多评论
立即登录/注册

微信扫码登录

0.0658s