一、问题引入

我们在SSM中使用SpringMVC的时候,需要由我们自己写SpringMVC的配置文件,需要用到什么就要自己配什么,配置起来也特别的麻烦。我们使用SpringBoot的时候没有进行配置,直接就能进行使用,这是为什么呢?

这是因为SpringBoot为我们自动配置好了SpringMVC

1)、我们首先参照官网来看一下关于SpringMVC的自动配置

​ https://docs.spring.io/spring-boot/docs/2.2.1.RELEASE/reference/htmlsingle/#boot-features-developing-web-applications

Spring MVC Auto-configuration

Spring Boot provides auto-configuration for Spring MVC that works well with most applications.

The auto-configuration adds the following features on top of Spring’s defaults:

  • Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.

    • 自动配置了ViewResolver(视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发?重定向?))
    • ContentNegotiatingViewResolver:组合所有的视图解析器的;
    • ==如何定制:我们可以自己给容器中添加一个视图解析器;自动的将其组合进来
  • Support for serving static resources, including support for WebJars (covered later in this document)).

静态资源文件夹路径.webjars

  • Automatic registration of Converter, GenericConverter, and Formatter beans.

自动注册了Converter, GenericConverter, and Formatter等

    • **Converter:转换器,**比如也面提交的是一个数字,但是页面的数字是文本类型的,通过转换器,就能转换成Integer类型
    • Formatter :格式化器,2020-1-1===Date;
  • Support for HttpMessageConverters (covered later in this document).

    • HttpMessageConverter:SpringMVC用来转换Http请求和响应的;
    • HttpMessageConverter是从容器中确定;获取所有的HttpMessageConverter;

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

定义错误代码生成规则

我们可以配置一个ConfigurableWebBindingInitializer来替换默认的;(添加到容器)

初始化WebDataBinder;

请求数据=====JavaBean;

If you want to keep Spring Boot MVC features and you want to add additional MVC configuration (interceptors, formatters, view controllers, and other features), you can add your own @Configuration class of type WebMvcConfigurer but without @EnableWebMvc. If you wish to provide custom instances of RequestMappingHandlerMapping, RequestMappingHandlerAdapter, or ExceptionHandlerExceptionResolver, you can declare a WebMvcRegistrationsAdapter instance to provide such components.

2、扩展SpringMVC

编写一个配置类(@Configuration),是WebMvcConfigurerAdapter类型;不能标注@EnableWebMvc;

If you want to take complete control of Spring MVC, you can add your own @Configuration annotated with @EnableWebMvc

3.全面接管SpringMVC

为什么@EnableWebMvc自动配置就失效了?

1)@EnableWebMvc的核心

@Import(DelegatingWebMvcConfiguration.class)

public @interface EnableWebMvc {

2)、

@Configuration

public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {

3)、

@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 {

4)、@EnableWebMvc将WebMvcConfigurationSupport组件导入进来;

5)、导入的WebMvcConfigurationSupport只是SpringMVC最基本的功能;

4.原理

关于ContentNegotiatingViewResolver


我们点进这个ContentNegotiatingViewResolver ,在下面有一个resolveViewName方法

那么是怎么样获取候选的视图对象的呢?

我们点进getCandidateViews这个方法

那么这个组合逻辑又是什么呢?

返回到我们这里


看到首先是new了一个ContentNegotiatingViewResolver对象

我们点进去,

我们所需要的ViewResolvers是从哪里拿到的呢?

我们接着往下边看

我们看到,这里有个初始化方法,里边利用BeanFactoryUtils工具,从容器中获取所有的视图解析器,把这些视图解析器就作为要组合的所有视图解析器。

那么如何定制我们自己的视图解析器呢,通过上面的讲解,就是:我们只需要自己给容器中添加一个视图解析器;然后ContentNegotiatingViewResolver就会将其

组合进来。

我们下面举个简单的例子给大家演示一下

为了方便,我们就在在SpringBoot的启动类中创建一个ViewResolver并将其添加到容器中

那么我们怎么判断是否其作用了呢,我们知道,视图解析器都会被DisPatcherServlet所扫描到,所有的请求都会被DisPatcherServlet类中的doDispatch方法所拦截

在doDispatch方法上打一个断点,debug运行,随便访问一个url,就能看到结果如下。

结果我们发现,我们自己加入的ViewResovler确实生效了

二.总结

1.假如我们需要扩展SpringMVC,只需要编写一个配置类(@Configuration),是WebMvcConfigurerAdapter类型;不标注@EnableWebMvc即可,这个时候我们既保留了所有的自动配置,也能用我们扩展的配置;

2.假如是需要全面接管,即所有的配置都需要我们自己来定义,我们就加上@EnableWebMvc注解即可。

 

SpringBoot中SpringMVC的自动配置以及扩展的更多相关文章

  1. java框架之SpringBoot(5)-SpringMVC的自动配置

    本篇文章内容详细可参考官方文档第 29 节. SpringMVC介绍 SpringBoot 非常适合 Web 应用程序开发.可以使用嵌入式 Tomcat,Jetty,Undertow 或 Netty ...

  2. Springboot中SpringMvc拦截器配置与应用(实战)

    一.什么是拦截器,及其作用 拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在方法执行之前或之后加入某些操作,其实就是AOP的一种实现策略.它通过动态拦截Action调用的对 ...

  3. SpringBoot中对SpringMVC的自动配置

    https://docs.spring.io/spring-boot/docs/1.5.10.RELEASE/reference/htmlsingle/#boot-features-developin ...

  4. 7、springmvc的自动配置

    1.springmvc的自动配置 文档:https://docs.spring.io/spring-boot/docs/2.1.1.RELEASE/reference/htmlsingle/#boot ...

  5. SpringMVC的自动配置解析

    https://docs.spring.io/spring-boot/docs/1.5.10.RELEASE/reference/htmlsingle/#boot-features-developin ...

  6. SpringBoot日记——SpringMvc自动配置与扩展篇

    为了让SpringBoot保持对SpringMVC的全面支持和扩展,而且还要维持SpringBoot不写xml配置的优势,我们需要添加一些简单的配置类即可实现: 通常我们使用的最多的注解是: @Bea ...

  7. SpringBoot | 4.1 SpringMVC的自动配置

    目录 前言 1. SpringMVC框架的设计与流程 1.1 SpringMVC框架的示意图 1.2 SpringMVC的组件流程 2. *自动配置的源码分析 2.1 导入Web场景启动器 2.2 找 ...

  8. springmvc以及springboot中的拦截器配置

    拦截器两种实现   如果不同的controller中都需要拦截器,不能使用相同的拦截器,因为拦截器不能跨controller,这个时候只能为不同的controller配置不同的拦截器,每一个拦截器只能 ...

  9. SpringBoot:配置文件及自动配置原理

    西部开源-秦疆老师:基于SpringBoot 2.1.6 的博客教程 秦老师交流Q群号: 664386224 未授权禁止转载!编辑不易 , 转发请注明出处!防君子不防小人,共勉! SpringBoot ...

随机推荐

  1. layer/layui弹出层插件bug

    <button class="layui-btn" lay-submit lay-filter="formDemo" id="layui-btn ...

  2. Vue递归菜单

    一.效果图: 二.代码(Vue Cli 快速原型开发) App.vue <template> <div id="app"> <template v-f ...

  3. Spring boot+JPA+Druid

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  4. 2018-9-1-win2d-画出好看的图形

    title author date CreateTime categories win2d 画出好看的图形 lindexi 2018-09-01 16:25:40 +0800 2018-2-13 17 ...

  5. Notice: Use of undefined constant - assumed ' '

    昨天看手册的时候有两个范例,懒得写了,直接复制,测试一下,结果报Notice; 反复检查无果,最后, 手动敲了一遍,居然正常了,汗.... 总结:偷懒害人

  6. Vue打包文件放在服务器,浏览器存在缓存问题的解决

    在入口文件index.html添加 <meta http-equiv="pragram" content="no-cache"> <meta ...

  7. HDU 1828“Picture”(线段树+扫描线求矩形周长并)

    传送门 •参考资料 [1]:算法总结:[线段树+扫描线]&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) •题意 给你 n 个矩形,求矩形并的周长: •题解1(两次扫描线) 周 ...

  8. java 代理的概念与作用

    1.引入: 为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如,异常处理.日志.计算方法的运行时间.事务管理.等等,你准备如何做? 编写一个与目标类具有相同接口的代理类,代理类的每个方 ...

  9. H3C 三种生成树协议特性的比较

  10. 一图理解vue生命周期

    博客园上传图不太清晰,可以查看我的CSDN https://blog.csdn.net/jiaoshuaiai/article/details/90046736 感谢: https://segment ...