Java深入浅出掌握SpringBoot之MVC自动配置原理篇
作者:龍弟-idea 发布时间:2022-04-16 02:14:34
Spring Boot 为 Spring MVC 提供了自动配置,适用于大多数应用程序。
官方文档描述:
自动配置在 Spring 的默认值之上添加了以下功能:
从官方描述解析:
If you want to keep Spring Boot MVC features and you want to add
additionalMVC configuration (interceptors, formatters, view controllers,
and other features), you can add your own
@Configuration class of type WebMvcConfigurer but without @EnableWebMvc.
扩展SpringMVC
由于WebMvcConfigurer是个接口
创建一个MyMvcConfig实现这个接口
之前我们学的视图解析器是我们手动配置
ViewResolver 实现了视图解析器接口的类,就看做是视图解析器
搜索ContentNegotiatingViewResolver,找到如下方法resolveViewName!找到对应的视图解析代码
从 getCandidateViews中看到它是把所有的视图解析器拿来,进行遍历循环
结论:ContentNegotiatingViewResolver 这个视图解析器就是用来组合所有的视图解析器的
可以看出它是从容器中去找视图解析器,我们也可以在容器中实现一个视图解析器!
容器中实现一个视图解析器
1、我们在主程序中去写一个视图解析器;
2、如何看我们自己写的视图解析器是否起了作用呢?
我们给 DispatcherServlet 中的 doDispatch方法 加个断点进行调试一下,因为所有的请求都会走到这个方法中!
3、我们启动我们的项目,然后随便访问一个页面,看一下Debug信息,找到this
4、找到视图解析器,我们看到我们自己定义的就在这里了;
所以说,我们如果想要使用diy定制的东西,我们只需要给容器中添加这个组件就好了,SpringBoot就会帮我们自动装配!
转换器和格式化器
找到格式化转换器:
点进去可以看到
如果配置了自己的格式化方式,就会注册到Bean中生效,我们可以在配置文件中配置日期格式化的规则:可以看到在我们的Properties文件中,我们可以进行自动配置它!
修改SpringBoot的默认配置
结论:我们要扩展SpringMVC,官方就推荐我们这么去使用,既保SpringBoot留所有的自动配置,也能用我们扩展的配置!
分析一下原理:
1、WebMvcAutoConfiguration 是 SpringMVC的自动配置类,里面有一个类WebMvcAutoConfigurationAdapter
2、这个类上有一个注解,在做其他自动配置时会导入:@Import(EnableWebMvcConfiguration.class)
3、我们点进EnableWebMvcConfiguration这个类看一下,它继承了一个父类:DelegatingWebMvcConfiguration
这个父类中有这样一段代码:
4、我们可以在这个类中去寻找一个我们刚才设置的viewController当做参考,发现它调用了一个
protected void addViewControllers(ViewControllerRegistry registry) {
this.configurers.addViewControllers(registry);
}
5、我们点进去看一下
public void addViewControllers(ViewControllerRegistry registry) {
Iterator var2 = this.delegates.iterator();
while(var2.hasNext()) {
// 将所有的WebMvcConfigurer相关配置来一起调用!包括我们自己配置的和Spring给我们配置的
WebMvcConfigurer delegate = (WebMvcConfigurer)var2.next();
delegate.addViewControllers(registry);
}
}
结论:所有的WebMvcConfiguration都会被作用,不止Spring自己的配置类,我们自己的配置类当然也会被调用
全面接管SpringMVC
全面接管即:SpringBoot对SpringMVC的自动配置不需要了,所有都是我们自己去配置!
只需在我们的配置类中要加一个@EnableWebMvc。
我们开发中,不推荐使用全面接管SpringMVC
1、这里看到它是导入了一个类,继续点进去看
2、它继承了一个父类 WebMvcConfigurationSupport
3、回顾一下Webmvc自动配置类
总结:@EnableWebMvc将WebMvcConfigurationSupport组件导入进来;
而导入的WebMvcConfigurationSupport只是SpringMVC最基本的功能!
来源:https://blog.csdn.net/weixin_48838340/article/details/120628025


猜你喜欢
- 目录1. 效果图2. 思路3. 实现步骤3.1 数据Bean类3.2 创建适配器3.3 继承Filterable接口3.4 过滤调用4. 优
- Android 四种获取屏幕宽度的方法方法一: WindowManager wm = (WindowManager) this
- 此篇文章内容仅限于 描述springboot与 thy 自定义标签的说明,所以你在看之前,请先会使用springboot和thymeleaf
- 用java实现的数组创建二叉树以及递归先序遍历,递归中序遍历,递归后序遍历,非递归前序遍历,非递归中序遍历,非递归后序遍历,深度优先遍历,广
- 引言最近,因为开发的时候经改动依赖的库,所以,我想对 Gradle 脚本做一个调整,用来动态地将依赖替换为源码。这里以 android-mv
- 一、代码实例实现功能将Array转换为List将List转换为Array将Array转换为Dictionary将Dictionary转换为A
- public class ReadBitmap { public void readByte(Context c, String name,
- android中提供了4中动画: AlphaAnimation 透明度动画效果 ScaleAnimation 缩放动画效果 Translat
- 微信聊天窗口的信息效果类似iphone上的短信效果,以气泡的形式展现,在Android上,实现这种效果主要用到ListView和BaseAd
- 这篇文章主要介绍了基于Jasypt对SpringBoot配置文件加密,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- Surface的拍照实现也是很简单,一个小demo就可以把流程看懂了。 话不多说,直接上代码布局文件<SurfaceView &nbs
- 本例只做简单功能演示,代码并不严谨,只是说明客户端如何实现连接服务端简单代码。代码在集成Eclipse工具下测试编译运行环境如下图所示:客户
- 装箱(boxing)和拆箱(unboxing)是C#类型系统的核心概念.是不同于C与C++的新概念!,通过装箱和拆箱操作,能够在值类型和引用
- 本文实例讲述了Android简单创建一个Activity的方法。分享给大家供大家参考,具体如下:1) 创建一个android项目填写项目信息
- C++中的动态数组(Dynamic Array)是指动态分配的、可以根据需求动态增长占用内存的数组。为了实现一个动态数组类的封装,我们需要考
- 先看看效果: 首先,导入包:compile files('libs/nineoldandroids-2.4.0.jar')r
- 工厂方法模式简述与简单工厂模式基本相同,只是工厂是一个抽象的,需要有具体的工厂去实现它,然后利用这个工厂生产产品,之所以出现这个模式是因为,
- 讲这个例子前,咱们先来看一个简单的程序:字符串数组实现数字转字母:#include <stdio.h>#include <
- 接着上一篇进行学习java文件上传下载1。五、断点续传 对于熟用QQ的程序员,QQ的断点续传功能应该是印象很深刻的。因为它很实用也
- 1.1、Web Service基本概念Web Service也叫XML Web Service WebService是一种可以接收从Inte