【肥朝】圖解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源碼解析系列不斷更新中,歡迎一塊兒"追劇"!



相關文章
相關標籤/搜索