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

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.mzph.cn/web/66698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【21】Word:德国旅游业务❗

目录 题目 NO1.2.3 NO4 NO5.6 NO7 NO8.9.10.11 题目 NO1.2.3 F12&#xff1a;另存为布局→页面设置→页边距&#xff1a;上下左右选中“德国主要城市”→开始→字体对话框→字体/字号→文本效果&#xff1a;段落对话框→对齐方式/字符间距/段落间距 NO4 布局→表对话框…

蓝桥杯算法日常|c\c++常用竞赛函数总结备用

一、字符处理相关函数 大小写判断函数 islower和isupper&#xff1a;是C标准库中的字符分类函数&#xff0c;用于检查一个字符是否为小写字母或大写字母&#xff0c;需包含头文件cctype.h&#xff08;也可用万能头文件包含&#xff09;。返回布尔类型值。例如&#xff1a; #…

微服务知识——4大主流微服务架构方案

文章目录 1、微服务聚合模式2、微服务共享模式3、微服务代理模式4、微服务异步消息模式 微服务是大型架构的必经之路&#xff0c;也是大厂重点考察对象&#xff0c;下面我就重点详解4大主流微服务架构方案。 1、微服务聚合模式 微服务聚合设计模式&#xff0c;解决了如何从多个…

【HTML+CSS】使用HTML与后端技术连接数据库

目录 一、概述 1.1 HTML前端 1.2 后端技术 1.3 数据库 二、HTML表单示例 三、PHP后端示例 3.1 连接数据库 3.2 接收数据并插入数据库 四、安全性 4.1 防止SQL注入 4.2 数据验证与清洗 五、优化 5.1 索引优化 5.2 查询优化 六、现代Web开发中的最佳实践 6.1 使用…

cadence笔记--画PMU6050原理图和封装

简介 本文主要介绍使用Cadence自己画一个PMU6050的原理图PCB的实际用例&#xff0c;Cadence使用的是24.1版本。 原理图 首先获取PMU6050引脚参数&#xff0c;使用立创商城查询PMU6050型号&#xff0c;点击数据手册如下图所示&#xff1a; 如下图所示&#xff0c;左边是原理图&…

Text2SQL 智能报表方案介绍

0 背景 Text2SQL智能报表方案旨在通过自然语言处理&#xff08;NLP&#xff09;技术&#xff0c;使用户能够以自然语言的形式提出问题&#xff0c;并自动生成相应的SQL查询&#xff0c;从而获取所需的数据报表&#xff0c;用户可根据得到结果展示分析从而为结论提供支撑&#…

FFmpeg音视频采集

文章目录 音视频采集音频采集获取设备信息录制麦克风录制声卡 视频采集摄像机画面采集 音视频采集 DirectShow&#xff08;简称DShow&#xff09;是一个Windows平台上的流媒体框架&#xff0c;提供了高质量的多媒体流采集和回放功能&#xff0c;它支持多种多样的媒体文件格式&…

【漫话机器学习系列】056.F1值(F1 score)

F1值&#xff08;F1 Score&#xff09; 定义 F1值是机器学习中一种用于评估模型性能的指标&#xff0c;特别适合用于 不平衡数据集 的分类任务。它是 精确率&#xff08;Precision&#xff09; 和 召回率&#xff08;Recall&#xff09; 的调和平均值。通过综合考虑精确率和召…

Mac安装Homebrew

目录 安装修改homeBrew源常用命令安装卸载软件升级软件相关清理相关 安装 官网 https://brew.sh/不推荐官网安装方式&#xff08;很慢很慢或者安装失败联网失败&#xff09; 检测是否安装homebrewbrew -v执行安装命令 苹果电脑 常规安装脚本 &#xff08;推荐 完全体 几分钟就…

一文大白话讲清楚webpack基本使用——9——预加载之prefetch和preload以及webpackChunkName的使用

文章目录 一文大白话讲清楚webpack基本使用——9——预加载之prefetch和preload1. 建议按文章顺序从头看&#xff0c;一看到底&#xff0c;豁然开朗2. preload和prefetch的区别2. prefetch的使用3. preload的使用4. webpackChunkName 一文大白话讲清楚webpack基本使用——9——…

【Elasticsearch 】 聚合分析:桶聚合

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

tensorflow源码编译在C++环境使用

https://tensorflow.google.cn/install/source?hlzh-cn查看tensorflow和其他需要下载软件对应的版本&#xff0c;最好一模一样 1、下载TensorFlow源码 https://github.com/tensorflow/tensorflow 2、安装编译protobuf&#xff08;3.9.2&#xff09; protobuf版本要和TensorFlo…

使用 F12 查看 Network 及数据格式

在浏览器中&#xff0c;F12 开发者工具的 “Network” 面板是用于查看网页在加载过程中发起的所有网络请求&#xff0c;包括 API 请求&#xff0c;以及查看这些请求的详细信息和响应数据的。以下以常见的 Chrome 浏览器为例&#xff0c;介绍如何使用 F12 控制台查看 Network 里…

Redis 2.6.12在Win10系统上的安装教程

诸神缄默不语-个人CSDN博文目录 这个版本的安装包是跟同事要的&#xff0c;em&#xff0c;如果真的需要这个版本的话可以跟我要&#xff1a; 解压后双击第一个bat文件&#xff0c;即可挂起Redis服务&#xff1a;

分布式数据库中间件(DDM)的使用场景

华为云分布式数据库中间件&#xff08;DDM&#xff09;是一款专注于解决数据库分布式扩展问题的中间件服务&#xff0c;突破了传统数据库的容量和性能瓶颈&#xff0c;能够实现海量数据的高并发访问。以下是九河云总结的DDM的典型使用场景&#xff1a; 1. 互联网应用 在电商、…

Ubuntu16.04 安装OpenCV4.5.4 避坑

Ubuntu16.04 安装C版OpenCV4.5.4 Ubuntu16.04 VSCode下cmakeclanglldb调试c 文章目录 Ubuntu16.04 安装C版OpenCV4.5.41. 下载Opencv压缩包2. 安装Opencv-4.5.43. 配置OpenCV的编译环境4.测试是否安装成功 1. 下载Opencv压缩包 下载Opencv压缩包&#xff0c;选择source版本。…

RabbitMQ集群安装rabbitmq_delayed_message_exchange

1、单节点安装rabbitmq安装延迟队列 安装延迟队列rabbitmq_delayed_message_exchange可以参考这个文章&#xff1a; rabbitmq安装延迟队列-CSDN博客 2、集群安装rabbitmq_delayed_message_exchange 在第二个节点 join_cluster 之后&#xff0c;start_app 就会报错了 (CaseC…

QT开发:事件循环与处理机制的概念和流程概括性总结

事件循环与处理机制的概念和流程 Qt 事件循环和事件处理机制是 Qt 框架的核心&#xff0c;负责管理和分发各种事件&#xff08;用户交互、定时器事件、网络事件等&#xff09;。以下是详细透彻的概念解释和流程讲解。 1. 事件循环&#xff08;Event Loop&#xff09;的概念 …

博客搭建 — GitHub Pages 部署

关于 GitHub Pages GitHub Pages 是一项静态站点托管服务&#xff0c;它直接从 GitHub 上的仓库获取 HTML、CSS 和 JavaScript 文件&#xff0c;通过构建过程运行文件&#xff0c;然后发布网站。 本文最终效果是搭建出一个域名为 https://<user>.github.io 的网站 创建…

网络通信---MCU移植LWIP

使用的MCU型号为STM32F429IGT6&#xff0c;PHY为LAN7820A 目标是通过MCU的ETH给LWIP提供输入输出从而实现基本的Ping应答 OK废话不多说我们直接开始 下载源码 LWIP包源码&#xff1a;lwip源码 -在这里下载 ST官方支持的ETH包&#xff1a;ST-ETH支持包 这里下载 创建工程 …