【spring boot2】第6篇:spring boot 对 spring mvc 的支持

news/2024/12/13 14:04:58

spring mvc 自动配置

spring boot 启动时会对 spring mvc 做自动配置,默认的配置功能在 org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration 中进行了说明。有以下功能:

  • 自动注册视图解析器 ContentNegotiatingViewResolverBeanNameViewResolver

    • ContentNegotiatingViewResolver:组合容器中不同ViewResovler
    • BeanNameViewResolver:根据返回的视图名称去找对应的视图,比如controller中方法返回的视图名称。
    • 如何自定义一个视图解析器?
      可以给容器中添加一个视图解析器,spring boot会自动的将其组合进来

      @Configuration
      public class MyViewConfig {@Beanpublic ViewResolver myView() {return new MyViewResolver();}private class MyViewResolver implements ViewResolver {@Nullable@Overridepublic View resolveViewName(String viewName, Locale locale)    throws Exception {System.out.println("----------------> my view resolver");return null;}}
      }

      通过在DispatcherServlet类中的doDispatch方法上断点可以查看容器中已经注入了我们自定义的视图解析器:
      图片描述
        

  • 支持对静态资源
  • 自动注册ConverterGenericConverterFormatter

    • ConverterGenericConverter : 对象参数转换器,把页面提交的文本参数转换为对象属性
    • Formatter :日期格式化器
  • 支持 HttpMessageConverters : spring mvc 中用来转换 http 请求和响应的。比如可以把一个对象转化为 json 格式的
  • 自动注册MessageCodesResolver: 定义错误代码响应规则的,默认规则可参考DefaultMessageCodesResolver
  • 支持静态欢迎首页index.html
  • 支持自定义 favicon 图标
  • 自动使用ConfigurableWebBindingInitializer : 初始化 WebDataBinder数据绑定器

扩展 spring mvc

有时候我需要保持保持 spring boot 对 spring mvc 的支持,同时会要求使用 spring mvc 的其他功能,比如拦截器功能,需要怎么办呢?

  • 我们的做法是给容器中添加一个自己的配置类(@Configuration),配置类的类型是WebMvcConfigurer,同时配置类不能被@EnableWebMvc注解注释。
/*** 扩展 spring mvc 功能*/
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/success").setViewName("success");}
}

全面控制 spring mvc

spring boot 对 spring mvc 的自动配置功能全部失效,spring mvc 的原始的功能都能够使用。需要我们做的是自定义的 spring mvc 配置类上添加注解 @EnableWebMvc即可。

@Configuration
@EnableWebMvc
public class MyMvcConfig implements WebMvcConfigurer {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/success").setViewName("success");}
}
  • 为什么 @EnableWebMvc注解会实现此功能呢?其原理如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {
}

可以看到@EnableWebMvc注解实现是导入了配置类DelegatingWebMvcConfiguration

@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
}

而该配置类继承了WebMvcConfigurationSupport,此时我们并没有发现什么特别之处,当你再观察 spring mvc 的配置类WebMvcAutoConfiguration时,发现该配置类中导入了WebMvcConfigurationSupport

@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
//容器中没有这个组件的时候,spring mvc的自动配置类才生效
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
}

@EnableWebMvcWebMvcConfigurationSupport组件导入到容器中,而WebMvcConfigurationSupport只是支持 spring mvc 的最基本功能


https://dhexx.cn/news/show-3536766.html

相关文章

多个vue项目公共组件的三种方法

这篇文章就来介绍前端多个vue项目用一个组件三种方法,npm发布引用、npm link、npm本地file引用,其中本文主要推荐本地file引用方式 方案一:npm发布引用 我们可以采取专人维护common包的方式,common的组件编写完成后,将…

var 变量在node跟浏览器环境的的声明

1. 用var关键字声明 浏览器环境 node环境 直接在terminal输入 在文件中通过var声明,然后用node执行 global.age输出的居然是undefined,简直了,搜索下,node环境下通过var声明的对象是挂载到哪里? 说明,在…

陕西被欠薪特岗教师收到部分补发工资 纪委介入

来源:中国青年报 陕西省渭南市临渭区特岗教师欠薪一事又有新进展。1月31日,临渭区委宣传部向中国青年报中青在线记者透露,临渭区教育局已在第一时间组织人力对报道反映的问题进行核查和统计,此事涉及的该区全部289名特岗教师,每人…

春运里的“夫妻守望号”

在哈尔滨西站,张悦呼叫后列列车长张嘉祥(1月30日摄)。 “G1206次前列列车长,后列旅客乘降完毕,请关闭车门。” “G1206次后列列车长,前列有一名旅客上错车,希望在前方沈阳北站从9车换乘到8车&am…

css自定义虚线(可设置虚线间隔)模拟虚线

.line {width: 2rpx;height: 100%;background: linear-gradient(to bottom, #9E9E9E 0%, #9E9E9E 50%,transparent 50%);background-size: 2rpx 12rpx;background-repeat: repeat-y; } 效果图 转载于:https://blog.csdn.net/weixin_50606255/article/details/12054…

反转链表 (剑指offer)

输入一个链表,反转链表后,输出新链表的表头。 方法一:头插法 链表问题通常用指针操作更清晰明了。反转链表只需要把当前指针从指向下一结点转向前一个结点即可。可是这样会导致链表断开。所以需要多加个指针记录后一个结点。 时间复杂度&…

Navigator.sendBeacon 无阻塞发送统计数据防ajax请求失败

业务场景 当用户关闭浏览器、刷新浏览器或者跳转其他页面时,向服务器发送一些统计数据。 常规方案 1. 直接发送 xhr 请求 我们会优先想到监听页面的unload或者beforeunload事件,在事件回调里使用XMLHttpRequest发送异步请求。 但是由于是xhr请求是异步发…

elementUI中table列表中的tooltip内容换行

这种情况下&#xff1a;show-overflow-tooltip是无法满足需求的。此时我们采取其他的方式。具体思路如下&#xff1a; 1.使用slot自定义el-tooltip内容 2.v-html指令转义&#xff0c;后端返回的数据使用正则处理&#xff0c;具体代码如下&#xff1a; <el-table-column prop…

mysql高级部分

mysql逻辑架构 连接层 最上层是一些客户端和连接服务&#xff0c;包含本地scoket同学和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信&#xff0c;主要完成一些类似连接处理&#xff0c;授权认证&#xff0c;及相关的安全方案&#xff0c;在该层引入线程池的概念&#…

vue elementUI select 下拉加载更多

有时候select里面的数据会很多&#xff0c;这时候就需要分页&#xff0c;那么我们如何监听select触底呢&#xff1f; 这时候我们就要写一个自定义指令&#xff0c;然后在main.js中注册&#xff0c;这个写两个版本&#xff0c;vue2.x和vue3 v-load-more‘loadMore’vue2.x 在src…