咱們都知道,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
以下:springboot
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {
}
複製代碼
那這個和全面接管Springmvc也沒看出有啥關係啊。咱們看一下這個DelegatingWebMvcConfiguration
的關係圖就一目瞭然了。mvc
咱們再看一下WebMvcAutoConfiguration
ide
@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源碼解析系列不斷更新中,歡迎一塊兒"追劇"!