图解源码 | 接管SpringMVC的自动配置

栏目: Java · 发布时间: 5年前

图解源码 | 接管SpringMVC的自动配置

前言

我们都知道,SpringBoot做了很多自动配置。但是很多 老司机 并不喜欢"自己动",而是更喜欢"一手掌控"的感觉。因此本篇我们就来聊聊,如何接管SpringBoot对SpringMVC的自动配置。

我们先来看一下springboot官方文档的描述:

74.7 Switch off the Default MVC configuration

The easiest way to take complete control over MVC configuration is to provide your own @Configuration with the @EnableWebMvc annotation. This will leave all MVC configuration in your hands.

当然考虑到有部分同学英文不好,看不懂上面是什么意思,但是又不敢问。因此,肥朝用小学体育老师(我真的没有黑体育老师的意思)教的英文,做了简单的翻译,如下:

完全控制MVC配置的最简单方法是使用@EnableWebMvc注解于您自己的@Configuration上。这将把所有MVC配置留在您的手中。

@EnableWebMvc 源码分析

@EnableWebMvc 如下:

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

那这个和全面接管Springmvc也没看出有啥关系啊。我们看一下这个 DelegatingWebMvcConfiguration 的关系图就一目了然了。

图解源码 | 接管SpringMVC的自动配置

我们再看一下 WebMvcAutoConfiguration

@Configuration
@ConditionalOnWebApplication
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class,
WebMvcConfigurerAdapter.class })
// 肥朝标重点:@EnableWebMvc中Import了WebMvcConfigurationSupport的子类
// 因此该MissingBean条件不满足,WebMvcAutoConfiguration失效。
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,
ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
// 忽略无关信息
}

拓展性思考

看源码,不要为了看而看,更重要的是 深入思考 。这句话肥朝每一篇都会强调,你就算嫌肥朝啰嗦,肥朝也要说。比如看完这个源码,我们究竟还能深入思考,压榨出什么信息呢?

一般Springboot自动配置无非两个套路。

  • spring.factories 方式,在spring.factories文件中,配置 org.springframework.boot.autoconfigure.EnableAutoConfiguration=xxx

  • EnableXXX 方式,通过 @Import 导入特定的配置类,在配置类中做配置

那这两个套路,有什么特点,适用于什么场景呢?

比如我们自定义了一个 starter ,如果用的是 spring.factories 这种自动配置方式,那么一旦引了 starter 这个jar,无需任何操作就做了自动配置。该优点是方便,引了相应的jar,在使用方无需感知的情况下,就做了自动配置,也就是大家说的,开箱即用。比如大家最熟悉的 spring-boot-starter-web ,你引jar的时候,就给你无感知的做了各种操作(各种操作具体是啥操作,欢迎继续追更Springboot源码解析系列),缺点是不够灵活,我只是单纯引个jar,就莫名其妙就和你做了一些 不可告人的约定配置

但是你用 EnableXXX 的这种配置,他是通过 @Import 导入特定配置类的方式。你可以的通过打不打注解,来决定你需不需要,做这个 不可告人的约定配置 。优点是可控性更大,缺点是,如果这种方式过多,我还要打好多注解,才能实现 开箱即用

使用场景:

从这两者的优缺点,以及我们对Springboot源码的阅读可以得出,比如在嵌入式web容器这些在开箱即用的场景下属于 必要性 需求,我们往往采用的是 spring.factories 的方式,但是对缓存这种,即使没有,也可以跑的 非必要性 需求上,我们采用的是 EnableXXX 方式。

肥朝建议:

我们明白了这两种自动配置方式的优缺点后,我们在看一下Springboot中 @EnableWebMvc 的设计。基本上完美融合了这两者的优缺点。Springboot先采用 spring.factories 的方式,让你在引用jar的时候,给你做了大量不可告人的约定配置。但是在这个自动配置上,预留了 @ConditionalOnMissingBean(xxx.class) 这样一个伏笔。当老司机想一手掌控的时候,只需要简单的一个 @EnableWebMvc ,就把这个自动配置取消,全面接管回来。这样既做到了开箱即用,也做到了,可控性大。

这些巧妙的方式,在你写 starter 的时候,都可以参考一下这种设计思想。

写在最后

另外不要再私聊肥朝说,面试官中问我, 你从源码中学到了什么? 我菊花一紧怎么办。肥朝的源码解析系列, 每篇 都在明示或者暗示 "怎么看源码?""看源码你学到了什么?" ,早就叫你星标置顶肥朝公众号你又不听,还老觉得有套路,是该紧一紧了!另外Springboot源码解析系列不断更新中,欢迎一起"追剧"!

图解源码 | 接管SpringMVC的自动配置

图解源码 | 接管SpringMVC的自动配置

图解源码 | 接管SpringMVC的自动配置


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

连线

连线

加里·沃尔夫 / 黄锫坚 / 中国铁道出版社 / 2006-7 / 29.80元

简言之,是一个人和一本杂志的传奇……   放在大环境中,是一个时代的跌宕起伏……   一直大力地向所有人推荐这本书,只是因为,故事真的很精彩,是一个伟大而疯狂的时代所造就的一个不屈不挠的斗士——路易斯·罗塞托,还有这本举世皆知的杂志——《连线》。   通过本书,中国读者会知道,新经济热潮的主角不仅是比尔·盖茨、杨致远等技术和商业能人,还有一大批新文化的传教士和吹鼓手,比如路易斯·......一起来看看 《连线》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

URL 编码/解码
URL 编码/解码

URL 编码/解码

SHA 加密
SHA 加密

SHA 加密工具