springboot web开发springmvc自动配置原理

前言

我们也知道springboot启用springmvc基本不用做什么配置可以很方便就使用了但是不了解原理,开发过程中遇到点问题估计就比较头疼,不管了解的深不深入,先巴拉一番再说…
下面我们先看看官网…我的版本是2.3.2版本,发现官网改动也比较大…不同版本自己巴拉下吧,结构虽然变化了,但是内容变的不是很多…
有变动的 都标有: covered later in this document

springmvc 自动配置原理

官网上说明

在这里插入图片描述
自动配置在Spring的默认设置之上添加了以下功能

  • ContentNegotiatingViewResolver and BeanNameViewResolver
    这2个bean 配置在WebMvcAutoConfiguration中
  1. 自动配置了ViewResolver(视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发?重定向?))
  2. ContentNegotiatingViewResolver:组合所有的视图解析器的;
  3. 如何定制:我们可以自己给容器中添加一个视图解析器;自动的将其组合进来;
  4. 代码
@SpringBootApplication
public class ComWebApplication {public static void main(String[] args) {SpringApplication.run(ComWebApplication.class, args);}@Beanpublic ViewResolver myViewReolver(){return new MyViewResolver();}public static class MyViewResolver implements ViewResolver{@Overridepublic View resolveViewName(String viewName, Locale locale) throws Exception {return null;}}}
  • Support for serving static resources, including support for WebJars (see below).静态资源文件夹路径,webjars 在静态资源映射规则中已经讲解
  • 自动注册了 of Converter , GenericConverter , Formatter beans.
    Converter:转换器;
    public String hello(User user):类型转换使用Converter
    Formatter 格式化器; 2017.12.17===Date;
public void addFormatters(FormatterRegistry registry) {ApplicationConversionService.addBeans(registry, this.beanFactory);}

自己添加的格式化器转换器,我们只需要放在容器中即可

  • HttpMessageConverter:SpringMVC用来转换Http请求和响应的;User—Json;

  • -HttpMessageConverters 是从容器中确定;获取所有的HttpMessageConverter;
    自己给容器中添加HttpMessageConverter,只需要将自己的组件注册容器中(@Bean,@Component)

  • Automatic registration of MessageCodesResolver (see below).定义错误代码生成规则

  • Static index.html support. 静态首页 在静态资源映射规则中已经讲解

  • Custom Favicon support (covered later in this document). favicon.icon 在静态资源映射规则中已经讲解

  • Automatic use of a ConfigurableWebBindingInitializer bean (see below).
    我们可以配置一个ConfigurableWebBindingInitializer来替换默认的;(添加到容器)
    初始化WebDataBinder;
    请求数据=====JavaBean;

在这里插入图片描述

springmvc 扩展

springboot 自动配置远远不能满足我们的开发生产需要所以我们自己需要扩展一些功能
比如我们原来在springmvc的配置文件中写的

 <mvc:view‐controller path="/hello" view‐name="success"/><mvc:interceptors><mvc:interceptor><mvc:mapping path="/hello"/><bean></bean></mvc:interceptor></mvc:interceptors>

我们都需要进行根据实际需要进行配置

在这里插入图片描述
If you want to keep those Spring Boot MVC customizations and make more MVC customizations (interceptors, formatters, view controllers, and other features), you can add your own @Configuration class of type WebMvcConfigurer but without @EnableWebMvc.

如果要保留这些Spring Boot MVC定制并进行更多的MVC定制(拦截器,格式化程序,视图控制器和其他功能),则可以添加自己的类型为WebMvcConfigurer的@Configuration类,但不添加@EnableWebMvc。

@Configuration
public class MySpringMvcConfig implements WebMvcConfigurer {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {//浏览器发送hello 跳转到success页面registry.addViewController("/hello").setViewName("success");}
}

编写一个配置类(@Configuration),是WebMvcConfigurer 类型;不能标注@EnableWebMvc;老版本是WebMvcConfigurerAdapter,这个是抽象类没有都是空方法
既保留了所有的自动配置,也能用我们扩展的配置;

我们一探究竟

原理:

  • WebMvcAutoConfiguration是SpringMVC的自动配置类
  • 、在做其他自动配置时会导入;@Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})
@Configuration(proxyBeanMethods = false)@Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})@EnableConfigurationProperties({WebMvcProperties.class, ResourceProperties.class})@Order(0)public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer {

EnableWebMvcConfiguration类

  @Configuration(proxyBeanMethods = false)public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration implements ResourceLoaderAware {private final ResourceProperties resourceProperties;

EnableWebMvcConfiguration父类中

public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();public DelegatingWebMvcConfiguration() {}//从容器中获取所有的WebMvcConfigurer@Autowired(required = false)public void setConfigurers(List<WebMvcConfigurer> configurers) {if (!CollectionUtils.isEmpty(configurers)) {this.configurers.addWebMvcConfigurers(configurers);}}

//;将所有的WebMvcConfigurer相关配置都来一起调用;

public void addWebMvcConfigurers(List<WebMvcConfigurer> configurers) {if (!CollectionUtils.isEmpty(configurers)) {this.delegates.addAll(configurers);}}
  • 、容器中所有的WebMvcConfigurer都会一起起作用

  • 、我们的配置类也会被调用;
    效果:SpringMVC的自动配置和我们的扩展配置都会起作用;
    注意这里说的都会起作用是说的针对不同的配置,比如是配置的静态文件映射,有的是viewController等等这些一起起作用

WebMvcRegistrations

如果要提供RequestMappingHandlerMapping,RequestMappingHandlerAdapter或ExceptionHandlerExceptionResolver的自定义实例,并且仍然保留Spring Boot MVC自定义,则可以声明WebMvcRegistrations类型的Bean,并使用它提供这些组件的自定义实例。

完全控制springmvc

If you want to take complete control of Spring MVC, you can add your own @Configuration annotated with @EnableWebMvc, or alternatively add your own @Configuration-annotated DelegatingWebMvcConfiguration as described in the Javadoc of @EnableWebMvc.
如果要完全控制Spring MVC,则可以添加用@EnableWebMvc注释的自己的@Configuration,或者按照@EnableWebMvc的Javadoc中的说明添加自己的@Configuration注释的DelegatingWebMvcConfiguration。

原理:

为什么@EnableWebMvc自动配置就失效了;

  • @EnableWebMvc
@Import({DelegatingWebMvcConfiguration.class})
public @interface EnableWebMvc {
}
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {

这样看来是说明我们导入了WebMvcConfigurationSupport

  • WebMvcAutoConfiguration 这个类我们知道是springmvc自动配置的核心类,在没有WebMvcConfigurationSupport这组件的时候才起作用
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {

这么说来我们目前知道WebMvcAutoConfiguration类以及失效了

  • 、导入的WebMvcConfigurationSupport只是SpringMVC最基本的功能;

如何修改SpringBoot的默认配置

模式:
1)、SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean、@Component)如果有就用用户配置的,如果没有,才自动配置;如果有些组件可以有多个(ViewResolver)将用户配置的和自己默认的组合起来;
2)、在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展配置
3)、在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置

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

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

相关文章

面试2:通用能力

15丨如何做好开场&#xff1a;给自我介绍加“特效 第一层&#xff0c;满足面试官对信息的期待 这是对自我介绍的基本要求&#xff0c;把个人信息、主要经历、经验和技能有条理地组织起来&#xff0c; 有逻辑地讲出来。需要找出多段经历的关联性和发展变化&#xff0c;形成连…

【数据结构-队列】双端队列

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

2023-简单点-编译是什么?gcc是什么?

编译目的 把一种 程序 变成 另一种更接近机器指令 编译的术语 “接近专家的最快方法第一步&#xff0c;直接了解100行业黑话” 那么来了解一下&#xff0c;编译过程中的黑话&#xff1a; 词法分析语法分析中间代码目标代码代码优化出错管理表格管理 gcc是个什么? 一种编译…

2023 年高教社杯全国大学生数学建模竞赛题D 题 圈养湖羊的空间利用率

2023 年全国大学生数学建模竞赛题D 题 圈养湖羊的空间利用率思路详解Python源码 昨天已经将E题第一二问的详解和思路源码都写了出来&#xff0c;大家如果想从E题下手的话推荐参考本人文章&#xff0c;个人认为E题在建模上是优于D题的&#xff0c;毕竟有给出数据而且有明确的建…

upload-labs 16/17关

16 将gif文件和包含一句话木马的php文件放在同一目录下&#xff0c;用cmd的copy命令将php文件整合进文件中。 可以看到最后一行包含了注入代码 将b1文件上传到服务器后&#xff0c;发现并未能正常执行代码&#xff0c;将上传后的文件下载到本地&#xff0c;打开后发现最后的代…

如何指定this

<script>/*如何指定this的值可以通过2类方法指定1.调用时指定1.1call方法1.2apply方法2.创建时指定2.1bind方法2.2箭头函数*/// ------1.调用时指定------//1.1call方法:挨个传入参数//1.2apply方法:数组形式传入参数function foo (numA, numB) {console.log(this)consol…

Python标识符命名规范

简单地理解&#xff0c;标识符就是一个名字&#xff0c;就好像我们每个人都有属于自己的名字&#xff0c;它的主要作用就是作为变量、函数、类、模块以及其他对象的名称。 Python 中标识符的命名不是随意的&#xff0c;而是要遵守一定的命令规则&#xff0c;比如说&#xff1a;…

深入理解联邦学习——联邦学习的分类

分类目录&#xff1a;《深入理解联邦学习》总目录 在实际中&#xff0c;孤岛数据具有不同分布特点&#xff0c;根据这些特点&#xff0c;我们可以提出相对应的联邦学习方案。下面&#xff0c;我们将以孤岛数据的分布特点为依据对联邦学习进行分类。 考虑有多个数据拥有方&…

一道面试题:介绍一下 Fragment 间的通信方式?

Fragment 间的通信可以借助以下几种方式实现&#xff1a; EventBusActivity&#xff08;or Parent Fragment&#xff09;ViewModelResult API 1. 基于 EventBus 通信 EventBus 的优缺点都很突出。 优点是限制少可随意使用&#xff0c;缺点是限制太少使用太随意。 因为 Even…

软路由ip的优势与劣势:了解其适用场景和限制

在网络技术的快速发展中&#xff0c;软路由IP作为一种灵活且功能强大的网络设备&#xff0c;越来越受到人们的关注。然而&#xff0c;正如任何技术一样&#xff0c;软路由IP也有其优势和劣势。本文将深入探讨软路由IP的优势、劣势以及其适用场景和限制&#xff0c;帮助你更好地…

深入讲解内存分配函数 malloc 原理及实现

任何一个用过或学过C的人对 malloc 都不会陌生。大家都知道malloc可以分配一段连续的内存空间&#xff0c;并且在不再使用时可以通过free释放掉。但是&#xff0c;许多程序员对malloc背后的事情并不熟悉&#xff0c;许多人甚至把malloc当做操作系统所提供的系统调用或C的关键字…

Streamlit 讲解专栏(十二):数据可视化-图表绘制详解(下)

文章目录 1 前言2 使用st.vega_lite_chart绘制Vega-Lite图表2.1 示例1&#xff1a;绘制散点图2.2 示例2&#xff1a;自定义主题样式 3 使用st.plotly_chart函数创建Plotly图表3.1 st.plotly_chart函数的基本用法3.2 st.plotly_chart 函数的更多用法 4 Streamlit 与 Bokeh 结合进…