玩转springboot之springboot扩展SpringMVC

springboot扩展SpringMVC

springboot为springmvc提供了很多自动配置,虽然适用于大部分应用,但是不一定适合你的应用

WebMvcConfigurer

WebMvcConfigurer是用来全局定制化Spring boot的MVC特性,可以通过实现WebMvcConfigurer接口来配置应用的MVC全局特性,但是由于该接口方法很多,全部实现比较麻烦,所以一般是继承WebMvcConfigurerAdapter类,该类实现了WebMvcConfigurer接口,并全部提供了空实现,可以选择需要自定义的来进行重写的

WebMvcConfigurerAdapter类在springboot2.x中就不建议使用了,因为java8中接口可以存在default方法,使得WebMvcConfigurerAdapter没有意义,直接实现WebMvcConfigurer接口即可

既保留自动配置又有扩展配置

根据官网的描述,如果想要扩展SpringBoot对于SpringMVC的配置而又保留SpringBoot对SpringMVC的自动配置,可以编写一个配置类(@Configuration)继承WebMvcConfigurerAdapter类,但是不能标注@EnableWebMvc

如果是使用的springmvc框架而非springboot框架的话,必须有@EnableWebMvc注解,否则重写WebMvcConfigurerAdapter的方法无效

@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {

    // 配置拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        super.addInterceptors(registry);
    }
    
    // 时间、数字格式化
    @Override
    public void addFormatters(FormatterRegistry registry) {
    }
    
    // 消息解析器
   // 对应xml中的 <mvc:annotation-driven>
    //    <mvc:message-converters register-defaults="true">
    //        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
    //            <constructor-arg value="UTF-8"/>
    //        </bean>
    //    </mvc:message-converters>
    //</mvc:annotation-driven>
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    }

    // 验证器  用以处理所有注解了@Valid的元素或注解了@Validated 的控制器方法参数
    @Override
    public Validator getValidator() {
        return null;
    }
  
   // 静态资源过滤
   // 对应xml 中的 <mvc:resources location="/WEB-INF/templates/" mapping="/templates/**"/>
   @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    }
   
  // 视图解析器 
  // 对应于在xml中配置 viewResolver的bean
   @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
    }
    
}
原因

为什么继承WebMvcConfigurerAdapter就可以扩展springmvc的配置呢?

在WebMvcAutoConfiguration类中有一个bean是WebMvcAutoConfigurationAdapter

 @Configuration
 @Import(EnableWebMvcConfiguration.class)
 @EnableConfigurationProperties(
{ WebMvcProperties.classResourceProperties.class })
 public static class WebMvcAutoConfigurationAdapter extends WebMvcConfigurerAdapter 
{

使用@Import来引入的这个组件中有一个方法,会将所有的WebMvcConfigurer类都加入到configurers中

public void setConfigurers(List<WebMvcConfigurer> configurers) {
  if (!CollectionUtils.isEmpty(configurers)) {
   this.configurers.addWebMvcConfigurers(configurers);
  }
 }

而WebMvcConfigurerAdapter就实现于WebMvcConfigurer

public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {

使用自定义配置抛弃自动配置

在上述配置类上加上@EnableWebMvc注解,就可以完全取代springboot对于springmvc的自动配置

原因

至于为什么会这样,看一下@EnableWebMvc这个注解就知道了

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc 
{
}

这个注解会引入一个DelegatingWebMvcConfiguration组件,而这个类是继承自WebMvcConfigurationSupport

@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {

接下来看一下WebMvcAutoConfiguration的加载条件是什么

@Configuration
@ConditionalOnWebApplication
@ConditionalOnClass({ Servlet.classDispatcherServlet.class,
  WebMvcConfigurerAdapter.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter(
{ DispatcherServletAutoConfiguration.class,
  ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration 
{

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

可以看到是在没有WebMvcConfigurationSupport这个bean的时候才会加载,所以打破了这个条件导致WebMvcAutoConfiguration不会生效

之前看到有人使用WebMvcConfigurationSupport来进行自定义配置,这里也要注意一下,如果使用了WebMvcConfigurationSupport的话,WebMvcAutoConfiguration是不会生效的,也就是说抛弃了webMvc的自动配置

https://zhhll.icu/2021/框架/springboot/基础/5.扩展SpringMVC/

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/757875.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

湖南(市场调研)源点咨询 市场研究中定性调研的优势与局限性

定性调研指的是调研的结果不经量化或数量分析。 它通常用于分析态度、感觉和动机。定性调研特别是焦点小组访谈法还在继续普及&#xff0c;原因有以下三个&#xff1a; 第一&#xff0c;定性调研通常比定量调研成本低&#xff1b; 第二&#xff0c;定性调研在了解消费者内心…

滑动窗口2

1. 水果成篮&#xff08;904&#xff09; 题目描述&#xff1a; 算法原理&#xff1a; 根据题目意思&#xff0c;friuts表示第i棵树上的水果种类&#xff0c;然后我们有两个篮子去在这些树上去采水果&#xff0c;但是有限制就是一个篮子里就只能装一种水果&#xff0c;也就是…

【简单讲解下OneFlow深度学习框架】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

SM2258XT量产工具,SM2258XT开卡三星SSV4颗粒成功分享,SM2259XT量产参考教程,威刚ADATA SP580开卡记录

前两天拆了笔记本上的威刚ADATA SP580 240GB&#xff0c;准备做移动硬盘用&#xff0c;装入移动硬盘盒之后接入电脑&#xff0c;发现系统可认盘&#xff0c;SMART显示正常&#xff0c;Windows的磁盘管理能显示正确容量&#xff0c;但处于未初始化状态&#xff0c;且始终无法初始…

病理性不对称引导的渐进学习用于急性缺血性脑卒中梗死分割| 文献速递-先进深度学习疾病诊断

Title 题目 Pathological Asymmetry-Guided Progressive Learning for Acute Ischemic Stroke Infarct Segmentation 病理性不对称引导的渐进学习用于急性缺血性脑卒中梗死分割 01 文献速递介绍 中风已经成为第二大致命疾病&#xff0c;大约70%的中风是缺血性的。众所周知…

AI in Law 法律领域AI应用-基于DeepNLP AI App Store 评论评测和排名

来源: quora 社区: https://deepnlpaistore.quora.com/ github: https://github.com/rockingdingo/deepnlp/blob/master/store/law.md 法律领域哪些AI服务应用更能满足用户的需求&#xff0c;排名最高? 参考deepnlp.org网站根据用户真实评论打分和show case分享&#xff0c;分…

java基于ssm+jsp 二手手机回收平台系统

1前台首页功能模块 二手手机回收平台系统&#xff0c;在系统首页可以查看首页、手机商城、新闻资讯、我的、跳转到后台、购物车等内容&#xff0c;如图1所示。 图1前台首页功能界面图 用户注册&#xff0c;在用户注册页面可以填写账号、密码、姓名、手机、邮箱、照片、地址、…

论文工具使用---connected papers

如何使用connected papers 使用方法具体功能其他资源 官网地址&#xff1a;connected papers &#xff1a;一个旨在帮助科研工作者快速搜索文献的全新工具&#xff0c;可以清晰的查看文献的引文信息&#xff0c;了解文献的引用和被引用关联。 使用方法 输入论文标题后&#xf…

如何配置Redis + Rdis在IDEA中的使用

文章目录 Step1. 下载zipStep2. 修改环境变量Step3. 启动Redis服务端Step4. 启动Redis客户端Step5. IDEA中链接Redis Step1. 下载zip 下载 Redis-x64-xxx.zip压缩包&#xff0c;解压到 E 盘后&#xff0c;将文件夹重新命名为 redis 下载地址&#xff1a;Redis下载地址 Step2…

Java----面向对象----总复习

面向对象 面向对象的程序设计思想(Object Oriented Programming),简称OOP.是一种设计者思想.关注的焦点是类,参照现实中的事务,将事务的属性特征,行为抽象出来,用类来表示.代码结构:以类为组织单位,每种事务都有自己的属性和行为,功能, 思想:从宏观上 帮助我们把握,整体分析整…

C语言的数据结构:树与二叉树(哈夫曼树篇)

前言 上篇讲完了二叉树&#xff0c;二叉树的查找性能要比树好很多&#xff0c;如平衡二叉树保证左右两边节点层级相差不会大于1&#xff0c;其查找的时间复杂度仅为 l o g 2 n log_2n log2​n&#xff0c;在两边层级相同时&#xff0c;其查找速度接近于二分查找。1w条数据&am…

160相交链表

解法1&#xff1a; public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {// 定义两个指针。// 获得两个链表的长度&#xff0c;将较长的链表先用指针移动到和短链表一样的长度。// 再一个个比较ListNode l1 headA, l2 headB;int …

vs2017调试MFC源码与dll版本不匹配

如上图&#xff0c;使用VS2017调试MFC源码&#xff0c;提示源码与dll不匹配。 经过一番折腾终于找到了原因&#xff1a;同时安装了vs2017、vs2022&#xff0c;结果加载的mfc140ud.dll不是vs2017的&#xff0c;而是vs2022的&#xff0c;主版本号虽然都是14&#xff0c;但小版本…

Jmeter下载、安装及配置

1 Jmeter介绍 Jmeter是进行负载测试的工具&#xff0c;可以在任何支持Java虚拟机环境的平台上运行&#xff0c;比如Windows、Linux、Mac。 Jmeter模拟一组用户向目标服务器发送请求&#xff0c;并统计目标服务器的性能信息&#xff0c;比如CPU、memory usage。 2 Jmeter下载 …

BLACKBOX.AI:解锁编程学习新纪元,加速开发的AI得力助手

文章目录 &#x1f4af;BLACKBOX.AI 官网&#x1f341;1 BLACKBOX.AI 工具使用教程&#x1f341;2 BLACKBOX.AI工具使用界面介绍&#x1f341;3 Chat(聊天)功能&#x1f341;4 Explore (探索)功能&#x1f48e;4.1 Terminal(终端)功能&#x1f48e;4.2 Discover(发现)功能&…

【Verilog HDL-1】基本、向量、模块

HDL习题 1 阻塞型赋值‘’与非阻塞型赋值‘<’ 阻塞型赋值 b a ba ba&#xff1a;适用于纯组合电路 非阻塞型赋值 b < a b<a b<a&#xff1a;适用与时序逻辑电路 2 wire线型,assign连续赋值 wire a,b,c; assign b a; assign c a;与编程语言不同&#xff…

普通集群与镜像集群配置

一. 环境准备 关闭防火墙和selinux&#xff0c;进行时间同步 rabbitmq-1 Rocky_linux9.4 192.168.226.22rabbitmq-2Rocky_linux9.4192.168.226.23rabbitmq-3Rocky_linux9.4192.168.226.24 修改主机名#192.168.226.22 hostnamectl set-hostname rabbitmq-1#192.168.226.22 ho…

【操作系统期末速成】 EP03 | 学习笔记(基于五道口一只鸭)

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文&#xff1a;☀️☀️☀️2.1 考点五&#xff1a;进程的概念及特征2.1 考点六&#xff1a;进程的状态与切换 一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 回报不在行动之后&#xff0c;回报在行动…

HIVE每日一题

select * from sku_info order by sku_id ; 为什么结果没有顺序排序。什么原因导致的&#xff1f;

75. UE5 RPG 创建场景摆放部件蓝图

这一篇文章来点简单的内容&#xff0c;相当于我们使用蓝图创建类似于unity的预制体。 创建一个一个柱子蓝图 首先&#xff0c;我们创建一个立柱的蓝图&#xff0c;将我们之前创建的柱子上面含有火焰和灯光的部分合并成一个蓝图&#xff0c;方便往场景内添加。 点击创建一个基…