SpringBoot-06——【SpringBoot对MVC自动装配、扩展SpringMVC、全面接管SpringMVC】

1、SpringBoot对SpringMVC自动配置

WebMvcAutoConfiguration:MVC自动配类

我们可以通过官方文档来看自动配置了什么东西

springboot:官方文档

在这里插入图片描述

图上springboot官方文档说明了对mvc自动装配的一些功能

1.1、ContentNegotiatingViewResolver分析

以装配ContentNegotiatingViewResolver视图解析器来说明

视图解析器:ViewResolver

先找大到WebMvcAutoConfiguration自动配类

他里面有一个内部类WebMvcAutoConfigurationAdapter

在这里插入图片描述

在这个内部类中找到一个方法viewResolver

在这里插入图片描述

进入这个对象

在这里插入图片描述

找到一个resolveViewName方法

在这里插入图片描述

这个方法的作用就是三步、获取所有的候选视图、在然后就是通过候选的视图得到一个最好的视图、将最好返回

看一下他是如何获取所有的候选视图的

在这里插入图片描述

打开这个方法、

在这里插入图片描述

可以看出他是从类的属性viewResolvers找到所有的视图

那么话又说回来了viewResolvers的值从哪来?

在他的ContentNegotiatingViewResolver类中的方法
在这里插入图片描述

图上说明了、在容器中获取所有的ViewResolver将其添加到viewResolvers类的属性中

最后可以得出一个小结、就是他会从容器中获取所有的视图解析器、并且选取后选的视图、那么我们要自己写一个视图解析器的话、要怎么办、解决方法就是写一个类实现ViewResolver接口、将其类注入到容器中。

例子:
在这里插入图片描述

自己new了一个ViewResolver将其注入到容器中、
在这里插入图片描述

通过在DispatcherServletdoDispatch方法打断点、可以看出我们自己创建的视图解析器也被加上了。

上面讲述只是将取了视图解析的自动配置、其余自动配置原理大致一样。

回到springboot官网
在这里插入图片描述

支持提供静态资源,包括对WebJars的支持(在本文档的后面部分中有介绍)。
/**
		配置静态资源文件夹路径、WebJars的支持
**/
  
自动注册Converter,GenericConverter和Formatter。
/**
		Converter:转换器(类型转换器)
		Formatter:格式化器
**/
  
支持HttpMessageConverters
 /**
		HttpMessageConverters:消息转换器
**/

自动注册MessageCodesResolver
 /**
		MessageCodesResolver:定义错误代码生成规则
**/
静态index.html支持。
/**
		在访问/请求的时候会找到templates中的index.html
**/

定制Favicon支持 
/**
		网页图标、在静态资源中设置一个名为Favicon.ico的图片
**/  

自动使用ConfigurableWebBindingInitializerbean
/**
		ConfigurableWebBindingInitializerbean:初始化web数据绑定器
**/  

以上是springboot对mvc的自动配置

org.springframework.boot.autoconfigure.web:是对所有web场景所有的自动配置的jar包位置

小结一个点:

  • springboot在自动配置中、有一个细节

  • 例子

    @Bean
    @ConditionalOnMissingBean(HiddenHttpMethodFilter.class)
    @ConditionalOnProperty(prefix = "spring.mvc.hiddenmethod.filter", name = "enabled", matchIfMissing = false)
    public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
      return new OrderedHiddenHttpMethodFilter();
    }
    

    @ConditionalOnMissingBean(HiddenHttpMethodFilter.class)这个注解的意思就是容器中这个bean这个注册bean就失效。然后使用我们自己配置的bean、有的组件可以有多个、他会将用户配置的和默认的配置的一起使用将其组合起来

1.2、扩展SpringMVC

在这里插入图片描述

在springboot官网上也是说了、如果要定制、就是扩展、需要添加一个配置类、类型为 WebMvcConfigurer 的一个配置类且不能添加 @EnableWebMvc 注解

测试:

@Configuration
public class MyConfig implements WebMvcConfigurer {
    //视图映射
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //浏览器访问http://localhost:8080/a 他会去通过视图解析找到对应的index.html页面
        registry.addViewController("/a").setViewName("index");
    }
}

这个只是扩展配置、不会将原有的配置替换掉、也就是说springboot帮我们配置的和我们自己配置的会一起生效。

原理:

  • 可以从WebMvcAutoConfiguration配置类里面来看、它是、mvc的自动配置类

在这里插入图片描述

WebMvcAutoConfigurationAdapter类中、导入了一个类

进入这个类
在这里插入图片描述

他继承了一个类

进入这个类

在这里插入图片描述

可以看到他将容器中的所有WebMvcConfigurer的类获取出来了然后将其放入WebMvcConfigurerComposite类的addWebMvcConfigurers()方法中

addWebMvcConfigurers()方法

在这里插入图片描述

这个方法做的事情就是将其获取出来WebMvcConfigurer放入WebMvcConfigurerComposite类的delegates属性中

最后会到这个WebMvcConfigurerComposite
在这里插入图片描述

随便找一个方法、点进configurePathMatch方法、

在这里插入图片描述

会发现他会将所有的WebMvcConfigurer遍历会将每一个WebMvcConfigurerconfigurePathMatch方法调用一遍。

小结:

  • springboot底层源码得出的结论就是、它会获取容器中所有的WebMvcConfigurer、并且调用每一个的WebMvcConfigurer中实现的方法、
  • 简单来说就是、springboot会调用SpringMVC自动配置类默认实现的方法、也会调用我们自己写的MVC扩展的实现方法。
  • 最后的效果就是、springMVC的自动配置和我们自己写的扩展配置都会生效。
  • 注意:
    • 在这里插入图片描述

    • 官网说的不能添加这个注解@EnableWebMvc

1.3、全面接管SpringMVC

什么是全面接管、就是springboot帮我们配置的我们不需要的、所有都是我们自己配置

我们只需要在配置类加上一个注解@EnableWebMvc

@Configuration
@EnableWebMvc
public class MyConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {

    }
}

为什么加上这个注解SpringMVC的自动配置就是全部失效呢??

点进这个注解@EnableWebMvc

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2W4TFhkw-1598938687971)(E:\笔记\SpringBoot\SpringBoot_1\img\1598928687309.png)]

会发现就是将一个WebMvcConfigurationSupport类注册到容器中了

WebMvcConfigurationSupport:是SpringMVC的基本功能。

在这里插入图片描述

回到springMVC自动配置类中、会发现上面有一个注解、

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

这个注解的意思就是、容器中没有这个组件时、这个自动配置类才生效

小结:

  • @EnableWebMvc:作用就是让springboot对springmvc的自动配置失效、
  • 其实没必要全面接管、扩展SPringMVC就可以,
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值