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

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

图解源码 | 接管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的自动配置


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

查看所有标签

猜你喜欢:

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

Clean Architecture

Clean Architecture

Robert C. Martin / Prentice Hall / 2017-9-20 / USD 34.99

Practical Software Architecture Solutions from the Legendary Robert C. Martin (“Uncle Bob”) By applying universal rules of software architecture, you can dramatically improve developer producti......一起来看看 《Clean Architecture》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具