說明:
在spring boot中如果定義了自己的java配置文件,並且在文件上使用了@EnableWebMvc 注解,那么sprig boot 的默認配置就會失效。如默認的靜態文件配置路徑:"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/",將失效。而有效的配置將只有自己寫的java配置 。
原理淺析:
1. 那么他是怎么將默認的配置都禁用的,跟蹤源碼分析下 ,首先看看@EnableWebMvc 這個注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE) @Documented @Import(DelegatingWebMvcConfiguration.class) //導入DelegatingWebMvcConfiguration類 public @interface EnableWebMvc { }
2.注解導入DelegatingWebMvcConfiguration類,而DelegatingWebMvcConfiguration 繼承 WebMvcConfigurationSupport 類
@Configuration public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport { ...//省略 }
3.來看看springMvc的自動配置類:
@Configuration @ConditionalOnWebApplication @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurerAdapter.class }) @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10) @AutoConfigureAfter(DispatcherServletAutoConfiguration.class) public class WebMvcAutoConfiguration { .../省略 }
看到標記黃色部分代碼沒,這個注解是條件注解,表示,如果容器中不存在 WebMvcConfigurationSupport這個類, WebMvcAutoConfiguration 配置類才會
才spring 加載。而我們使用注解@EnableWebMvc就把 WebMvcAutoConfiguration 這個類加載到了spring容器中 。所以 WebMvcAutoConfiguration 默認配置類將失效。