[0242-06].第06节:SpringBoot对SpringMVC的自动配置

embedded/2025/1/23 4:37:06/

SpringBoot学习大纲


一、基于SpringBoot搭建Web工程:

1.1.编码实现步骤:

a.创建SpringBoot项目

在这里插入图片描述

b.选中依赖:选中我们所需要的模块

在这里插入图片描述


1.2.SSM中的WEB开发配置与SpringBoot中WEB开发自动配置对比:

a.SSM中的WEB开发:

  • 1.在SSM 整合时,需要手动配置 Tomcat 、配置 SpringMVC、配置如何扫描包、配置字符过滤器、配置视图解析器、文件上传等,如下图所示的配置,非常麻烦。在这里插入图片描述
    在这里插入图片描述

b.SpringBoot中的web开发:

在SpringBoot 中,存在自动配置机制,提高开发效率

  • 1.导入web开发的场景:
    在这里插入图片描述
  • 2.引入场景启动器后,就引入了autoconfigure功能
  • 3.@EnableAutoConfiguration注解使用@Import(AutoConfigurationImportSelector.class)批量导入组件

二、SpringBoot在Web场景下的自动配置:

2.1.Web开发相关的自动配置类:

  • 1.如下是在引入web开发的场景启动器后,会找到这些全类名,然后根据这些全类名批量加载自动配置类组件到容器中
    在这里插入图片描述
  • 2.SpringBoot启动默认加载 xxxAutoConfiguration(这些类就是自动配置类)这些类都在如下这个org包中:
    在这里插入图片描述
  • 3.其中与web开发有关的自动配置类都在web目录中

2.2.SpringBoot对SpringMVC自动配置

a.SpringBoot对SpringMVC自动的默认配置

在这里插入图片描述

b.SpringBoot中对SpringMVC的定制化开发:

  • 1.全自动的默认配置:
    • 含义解释:保持 SpringBootMVC的默认配置,并且自定义更多的 mvc 配置,如:interceptors, formatters, view controllers 等
    • 实现方式:使用@Configuration注解添加一个 WebMvcConfigurer 类型的配置类,并不要标注 @EnableWebMvc
  • 2.手动自动结合:
    • 含义解释:保持 SpringBootMVC的默认配置,但要自定义核心组件实例,比如:RequestMappingHandlerMapping, RequestMappingHandlerAdapter, 或ExceptionHandlerExceptionResolver,
    • 实现方式:@Configuration 标注一个配置类,实现 WebMvcConfigurer 接口,给容器中放一个 WebMvcRegistrations 组件即可
  • 3.全手动方式:
    • 含义解释:全面接管 Spring MVC
    • 实现方式:@Configuration 标注一个配置类,并加上 @EnableWebMvc注解,实现 WebMvcConfigurer 接口

2.3.分析WebMvcAutoConfiguration类的源码:

a.定位SpringMVC相关的自动配置类源码:

  • 1.SpringBoot中对SpringMVC功能的自动配置类WebMvcAutoConfiguration
    在这里插入图片描述

b.WebMvcAutoConfiguration类源码分析:

1、WebMvcAutoConfiguration类的源码:

  • 可以看到这个类上@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)、@ConditionalOnClass()、ConditionalOnWebApplication条件注解
    在这里插入图片描述

2、分析:WebMvcAutoConfiguration类生效条件

  • 1.@AutoConfiguration(after = { DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class })意思是在DispatcherServletAutoConfiguration、TaskExecutionAutoConfiguration(异步任务)、ValidationAutoConfiguration(数据校验)配置好了之后,WebMvcAutoConfiguration再进行配置
  • 2.@ConditionalOnWebApplication(type = Type.SERVLET) 如果是web应用就生效,类型是SERVLET、REACTIVE响应式编程
  • 3.@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class }):容器中有Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class这些Bean才生效,这里我们引入了web场景,所以可以判断出自动配置类是WebMvcAutoConfiguration是生效的
  • 4.@ConditionalOnMissingBean(WebMvcConfigurationSupport.class):容器中没有WebMvcConfigurationSupport这个Bean才生效
  • 5.@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10):定义的是优先级

3、其他说明:

  • 1.如果创建xxxConfig类并实现WebMvcConfiger,就会使WebMvcAutoConfiguration配置类失效,因为在该类中有@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)这个注解会触发
  • 2.@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)这个注解会触发的原因是我们在自定义的xxConfig类中实现了WebMvcConfiger,点进WebMvcConfiger这个接口就可以知道它继承了WebMvcConfigurationSupport,所以springboot自动帮我们配置好的webMvcAutoConfiguration就会失效,注意只是我们在xxxConfig类中重写的default失效

c.分析当webMvcAutoConfiguration生效时会自动配置什么:

c1.配置了SpringMVC兼容Rest风格的请求
  • HiddenHttpMethodFilter;页面表单提交Rest请求(GET、POST、PUT、DELETE)
    在这里插入图片描述
c2.配置了表单内容的过滤器:
  • 1.可以配合HiddenHttpMethodFilter过滤器使用
  • 2.表单内容Filter,GET(数据放URL后面)、POST(数据放请求体)请求可以携带数据,PUT、DELETE 的请求体数据会被忽略,使用OrderedFormContentFilter可以实现PUT、DELETE类型的请求体不被忽略
    在这里插入图片描述

c3.配置了静态内部类:WebMvcAutoConfigurationAdapter

1、配置的静态内部类WebMvcAutoConfigurationAdapter作用:

  • 静态内部类WebMvcAutoConfigurationAdapter的作用就是给容器中放了WebMvcConfigurer组件;给SpringMVC添加各种定制功能

2、介绍静态内部类WebMvcAutoConfigurationAdapter类所实现的WebMvcConfigurer接口:

====================== SpringBoot2中WebMvcAutoConfigurationAdapter类的源码===================

  • 1.如下可以看到静态内部类WebMvcAutoConfigurationAdapter仅实现了WebMvcConfigurer接口
    在这里插入图片描述
    ====================== SpringBoot3中WebMvcAutoConfigurationAdapter类的源码===================
  • 1.如下可以看到静态内部类WebMvcAutoConfigurationAdapter实现了WebMvcConfigurer接口
    在这里插入图片描述
  • 2.ctrl + F12可以看到WebMvcConfigurer接口中的所有方法,这些抽象方法提供了配置SpringMVC底层的所有组件的入口:
    在这里插入图片描述
  • 3.下面我对接口中的抽象方法的功能进行了说明:
    在这里插入图片描述

3、解析静态内部类WebMvcAutoConfigurationAdapter上标注的注解:

========== ==SpringBoot2中静态内部类WebMvcAutoConfigurationAdapter上标注的注解 =================

  • 1.注解1 @Configuration:在WebMvcAutoConfigurationAdapter类上有注解@Configuration,所以说这个类是属于一个配置类
    在这里插入图片描述
  • 2.注解2 @EnableConfigurationProperties 根据@EnableConfigurationProperties({WebMvcProperties.class,ResourceProperties.class})可见有xxxxproperties,这说明配置文件的属性配置是和实体类xxx绑定在一起的
    在这里插入图片描述
  • 3.由下图可知:配置文件中WebMvcProperties==spring.mvcResourceProperties==spring.resources进行了绑定
    在这里插入图片描述
  • 2.WebMvcProperties分析:
    在这里插入图片描述
  • 3.ResourceProperties分析:
    在这里插入图片描述

========== ==SpringBoot3中静态内部类WebMvcAutoConfigurationAdapter上标注的注解 =================

  • 1.@EnableConfigurationProperties注解: 根据@EnableConfigurationProperties({ WebMvcProperties.class, WebProperties.class })可见有xxxxproperties,这说明配置文件的属性配置是和实体类xxx绑定在一起的
    在这里插入图片描述
  • 2.根据如下源码可知:WebMvcProperties对配置文件中的spring.mvc 进行了绑定
    在这里插入图片描述
  • 3.根据如下源码可知:WebProperties对配置文件中的spring.web 进行了绑定
    在这里插入图片描述

4、扩展知识当某个配置类只有一个有参构造器的时候,有参构造器所有参数的值都会从容器中确定

  • 这里的WebMvcAutoConfigurationAdapter配置类就是只有一个有参构造器!!!,所以所有参数的值都会从容器中确定
    在这里插入图片描述
    • ResourceProperties resourceProperties;获取和spring.resources绑定的所有的值的对象
    • WebMvcPropertiesmvcProperties :获取和spring.mvc绑定的所有的值的对象
    • ListableBeanFactorybeanFactory :Spring的beanFactory(容器工厂)
    • HttpMessageConverters:找到所有的HttpMessageConverters
    • ResourceHandlerRegistrationCustomizer: 找到资源处理器的自定义器(重点)
    • ServletRegistrationBean:给应用注册Servlet,Filter…

c4.配置了message Converters

在这里插入图片描述


c5.配置了视图解析器:

在这里插入图片描述


c6.配置了资源处理器:
  • 1.在这个资源处理器方法中中设置了所有资源处理的默认规则,下面对其中的代码进行分析:
    在这里插入图片描述

1、查看resourceProperties中的第1个属性是:isAddMappings,是和静态资源访问相关的

  • 1.在资源处理器源码中可以看到先判断this.resourceProperties.isAddMappings()是否为真
    在这里插入图片描述
  • 2.this.resourceProperties的值是从哪里来的呢?? 根据源码可知,是从这个类中的有参构造中获取到的在这里插入图片描述
  • 3.在构造器这里的resourceProperties的值是,都是从容器中拿到的
    在这里插入图片描述

2、分析在isAddMappings()方法的含义:

  • 1.点击isAddMappings(),查看isAddMappings()源码
    在这里插入图片描述
  • 2.在isAddMappings()方法中返回了isAddMappings的属性值
    在这里插入图片描述
  • 3.可以看到isAddMappings属性的默认值是true:
    在这里插入图片描述
  • 4.ResourcesProperties这个类是和spring.resources绑定在一起的,我在配置文件中设置isAddMappings值为false:
    在这里插入图片描述
  • 5.我在配置文件配置后,所有的静态资源都被禁用,执行在if判断中的内容后就return了:
    在这里插入图片描述

3、查看resourceProperties中的第二个属性是:Cache,是和配置缓存策略相关的

  • 1.分析缓存配置:
    在这里插入图片描述
  • 2.配置缓存配置时间,缓存时间以秒为单位:
    在这里插入图片描述

4、再继续分析下面的代码:就是判断webjars请求相关的了:

  • 1.当请求是webjars/**。就去资源目录META-INF/下去查找资源,且同时设置了资源缓存的时间:
    在这里插入图片描述
  • 2.请求测试设置的缓存时间是否生效:
    在这里插入图片描述
    在这里插入图片描述
c7.配置了欢迎页的处理规则:
  • 1.HandlerMapping:就是处理器映射。在其中保存了每一个Handler能处理哪些请求
    	@Beanpublic WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext,FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(new TemplateAvailabilityProviders(applicationContext), applicationContext, getWelcomePage(),this.mvcProperties.getStaticPathPattern());welcomePageHandlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));welcomePageHandlerMapping.setCorsConfigurations(getCorsConfigurations());return welcomePageHandlerMapping;}WelcomePageHandlerMapping(TemplateAvailabilityProviders templateAvailabilityProviders,ApplicationContext applicationContext, Optional<Resource> welcomePage, String staticPathPattern) {if (welcomePage.isPresent() && "/**".equals(staticPathPattern)) {//要用欢迎页功能,必须是/**logger.info("Adding welcome page: " + welcomePage.get());setRootViewName("forward:index.html");}else if (welcomeTemplateExists(templateAvailabilityProviders, applicationContext)) {// 调用Controller  /indexlogger.info("Adding welcome page template: index");setRootViewName("index");}}
  • 2.如下代码截图可以看到要用欢迎页功能,请求路径必须是/**,一旦加了前缀就失效了
    在这里插入图片描述


http://www.ppmy.cn/embedded/156228.html

相关文章

非局域网win实现远程桌面控制ubuntu

如果你想使用 VNC 从 Windows 电脑连接到 Ubuntu 电脑&#xff0c;下面是详细的步骤指南&#xff0c;包括在 Ubuntu 和 Windows 电脑上需要做的操作。 在 Ubuntu 电脑上配置 VNC 安装 VNC 服务器&#xff1a; 你可以使用 TigerVNC 或 x11vnc 作为 VNC 服务器&#xff0c;下面是…

ASP.NET Core 中基于 Cookie 的身份鉴权实现

在 ASP.NET Core 应用中&#xff0c;基于 Cookie 的身份鉴权是一种常见的身份验证方式&#xff0c;特别适用于传统的 Web 应用程序。Cookie 能够在用户的浏览器中存储身份验证数据&#xff0c;从而在用户访问应用的不同页面时保持登录状态。 一、配置 Cookie 身份验证 首先&a…

异地IP属地代理业务解析:如何改变IP属地

在数字化时代&#xff0c;IP地址作为网络设备的唯一标识符&#xff0c;不仅关乎设备间的通信&#xff0c;还涉及到用户的网络身份与位置信息。随着互联网的深入发展&#xff0c;异地IP属地代理业务逐渐走进大众视野&#xff0c;成为许多用户关注的话题。本文将详细解析异地IP属…

C++经典例题

当前进度为一周三篇。。。。。。》》》》》》》》 字符串篇 A: 找第一个只出现一次的字符 题目描述 给给定一个只包含小写字母的字符串&#xff0c;请你找到第一个仅出现一次的字符。如果没有&#xff0c;输出no。 输入 一一个字符串&#xff0c;长度小于等于100000。 输…

落地级分类模型训练框架搭建(1):resnet18/50和mobilenetv2在CIFAR10上测试结果

目录 前言 1.分类结果测试汇总 2.训练过程可视化 ResNet18直接训练&#xff08;准确率、召回率、Loss&#xff09; ResNet50直接训练&#xff08;准确率、召回率、Loss&#xff09; 3.模型权重分析 一般的训练&#xff0c;获取的模型权重分布 引入约束化训练的模型权重…

github汉化

本文主要讲述了github如何汉化的方法。 目录 问题描述汉化步骤1.打开github&#xff0c;搜索github-chinese2.打开项目&#xff0c;打开README.md3.下载安装脚本管理器3.1 在README.md中往下滑动&#xff0c;找到浏览器与脚本管理器3.2 选择浏览器对应的脚本管理器3.2.1 点击去…

【深度学习】常见模型-多层感知机(MLP,Multilayer Perceptron)

多层感知机&#xff08;MLP&#xff09;是一种经典的人工神经网络结构&#xff0c;由输入层、一个或多个隐藏层以及输出层组成。每一层中的神经元与前一层的所有神经元全连接&#xff0c;且各层间的权重是可学习的。MLP 是深度学习的基础模型之一&#xff0c;主要用于处理结构化…

SQL进阶——JOIN操作详解

在数据库设计中&#xff0c;数据通常存储在多个表中。为了从这些表中获取相关的信息&#xff0c;我们需要使用JOIN操作。JOIN操作允许我们通过某种关系&#xff08;如相同的列&#xff09;将多张表的数据结合起来。它是SQL中非常重要的操作&#xff0c;广泛应用于实际开发中。本…