【肥朝】图解Springboot源码 | 全面接管springmvc配置

前言

咱们都知道,SpringBoot作了不少自动配置。可是不少老司机并不喜欢"本身动",而是更喜欢"一手掌控"的感受。所以本篇咱们就来聊聊,如何接管SpringBoot对SpringMVC的自动配置。java

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

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.面试

固然考虑到有部分同窗英文很差,看不懂上面是什么意思,可是又不敢问。所以,肥朝用小学体育老师(我真的没有黑体育老师的意思)教的英文,作了简单的翻译,以下:spring

彻底控制MVC配置的最简单方法是使用@EnableWebMvc注解于您本身的@Configuration上。这将把全部MVC配置留在您的手中。缓存

@EnableWebMvc 源码分析

@EnableWebMvc以下:springboot

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

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

咱们再看一下WebMvcAutoConfigurationide

@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 {
	// 忽略无关信息
}
复制代码

拓展性思考

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

通常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源码解析系列不断更新中,欢迎一块儿"追剧"!



相关文章
相关标签/搜索