Java深入浅出掌握SpringBoot之MVC自动配置原理篇

作者:龍弟-idea 时间:2022-04-16 02:14:34 

Spring Boot 为 Spring MVC 提供了自动配置,适用于大多数应用程序。

官方文档描述:

自动配置在 Spring 的默认值之上添加了以下功能:

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

从官方描述解析:


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是个接口

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

创建一个MyMvcConfig实现这个接口

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

之前我们学的视图解析器是我们手动配置

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

ViewResolver 实现了视图解析器接口的类,就看做是视图解析器

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

搜索ContentNegotiatingViewResolver,找到如下方法resolveViewName!找到对应的视图解析代码

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

从 getCandidateViews中看到它是把所有的视图解析器拿来,进行遍历循环

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

结论:ContentNegotiatingViewResolver 这个视图解析器就是用来组合所有的视图解析器的

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

可以看出它是从容器中去找视图解析器,我们也可以在容器中实现一个视图解析器!

容器中实现一个视图解析器

1、我们在主程序中去写一个视图解析器;

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

2、如何看我们自己写的视图解析器是否起了作用呢?

我们给 DispatcherServlet 中的 doDispatch方法 加个断点进行调试一下,因为所有的请求都会走到这个方法中!

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

3、我们启动我们的项目,然后随便访问一个页面,看一下Debug信息,找到this

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

4、找到视图解析器,我们看到我们自己定义的就在这里了;

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

所以说,我们如果想要使用diy定制的东西,我们只需要给容器中添加这个组件就好了,SpringBoot就会帮我们自动装配!

转换器和格式化器

找到格式化转换器:

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

点进去可以看到

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

如果配置了自己的格式化方式,就会注册到Bean中生效,我们可以在配置文件中配置日期格式化的规则:可以看到在我们的Properties文件中,我们可以进行自动配置它!

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

修改SpringBoot的默认配置

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

结论:我们要扩展SpringMVC,官方就推荐我们这么去使用,既保SpringBoot留所有的自动配置,也能用我们扩展的配置!

分析一下原理:

1、WebMvcAutoConfiguration 是 SpringMVC的自动配置类,里面有一个类WebMvcAutoConfigurationAdapter

2、这个类上有一个注解,在做其他自动配置时会导入:@Import(EnableWebMvcConfiguration.class)

3、我们点进EnableWebMvcConfiguration这个类看一下,它继承了一个父类:DelegatingWebMvcConfiguration

这个父类中有这样一段代码:

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

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、这里看到它是导入了一个类,继续点进去看

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

2、它继承了一个父类 WebMvcConfigurationSupport

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

3、回顾一下Webmvc自动配置类

Java深入浅出掌握SpringBoot之MVC自动配置原理篇

总结:@EnableWebMvc将WebMvcConfigurationSupport组件导入进来;

而导入的WebMvcConfigurationSupport只是SpringMVC最基本的功能!

来源:https://blog.csdn.net/weixin_48838340/article/details/120628025

标签:Java,SpringBoot,MVC,自动配置,原理
0
投稿

猜你喜欢

  • Android中的Bitmap缓存池使用详解

    2023-02-23 15:01:15
  • 基于C#实现乱码视频效果

    2022-01-25 14:29:56
  • Android横竖屏切换实例总结

    2022-06-26 20:48:04
  • Android通过json向MySQL中读写数据的方法详解【写入篇】

    2022-07-20 19:12:39
  • winform实现限制及解除鼠标移动范围的方法

    2023-07-17 22:11:51
  • C#实现多线程的同步方法实例分析

    2021-11-01 11:56:42
  • Java设计模式编程中的工厂方法模式和抽象工厂模式

    2023-03-19 05:50:48
  • 结合mybatis-plus实现简单不需要写sql的多表查询

    2021-06-25 12:54:22
  • Android使用友盟集成QQ、微信、微博等第三方分享与登录方法详解

    2022-03-07 01:46:30
  • java 中接口和抽象类的区别与对比

    2022-07-09 04:13:03
  • Android应用程序模型之应用程序,任务,进程,线程分析

    2021-10-09 02:17:45
  • 安卓(Android)中如何实现滑动导航

    2023-10-17 10:51:18
  • 10k+点赞的 SpringBoot 后台管理系统教程详解

    2021-08-11 14:39:44
  • flutter实现头部tabTop滚动栏

    2022-03-21 14:00:06
  • Android编程实现下载时主界面与详细界面一致更新的方法

    2023-01-02 10:07:35
  • Java使用Iterator迭代器遍历集合数据的方法小结

    2021-10-28 00:22:40
  • 实例分析Java中public static void main(String args[])是什么意思

    2023-10-18 16:34:01
  • Java 17 更快的 LTS 节奏

    2023-07-08 11:36:19
  • Java 深入探讨设计模式之原型模式篇

    2023-11-16 17:37:59
  • Java中遍历ConcurrentHashMap的四种方式详解

    2023-11-17 08:54:41
  • asp之家 软件编程 m.aspxhome.com