今天看項目的代碼的時候發現了一個有趣的事情,一個為了解決跨域問題的配置類
//@Configuration
public class CorsConfigure extends WebMvcConfigurationSupport
我發現繼承的是
WebMvcConfigurationSupport,然后我看網上對於跨域問題的解決配置類中繼承的都是WebMvcConfigurationAdapter
我就覺得很奇怪,就去百度了一下他們的差別,現在記錄一下
1.@EnableWebMvc+extends WebMvcConfigurationAdapter,在擴展的類中重寫父類的方法即可,這種方式會屏蔽springboot的@EnableAutoConfiguration中的設置
2.extends WebMvcConfigurationSupport,在擴展的類中重寫父類的方法即可,這種方式會屏蔽springboot的@EnableAutoConfiguration中的設置
3.extends WebMvcConfigurationAdapter,在擴展的類中重寫父類的方法即可,這種方式依舊使用springboot的@EnableAutoConfiguration中的設置
至於為什么會屏蔽@EnableAutoConfiguration的設置,這要看@EnableAutoConfiguration到底做了什么,springMvc在boot完成自動裝配相關的類:WebMvcAutoConfiguration
@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,
ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration
可以看到一旦boot中一旦出現WebMvcConfigurationSupport類的話,這個自動裝配的類就不會出現了,這就是上述1,2表述的原因
另外現在WebMvcConfigurationAdapter已經被WebMvcConfigurer代替
至於3,比較復雜,想要深入了解可以參考原文
注意:經過我實踐發現,在springboot項目中 一旦寫了一個配置類 繼承WebMvcConfigurationSupport 之后 再寫一個類 實現 WebMvcConfigurer 就沒有效果了!但是一旦在boot項目中,加上@EnableAWebMvc之后,
繼承WebMvcConfigurationSupport 的類就失效了,實現 WebMvcConfigurer 的類就起作用了
也就是說 使用 implement WebMvcConfigurer 會在支持原有默認配置的情況下 新增配置 一旦加入@EnableWebMvc相當於引入了WebMvcConfigurationSupport 就會屏蔽掉默認的配置
參考
原文:https://blog.csdn.net/lqadam/article/details/80637335