@EnableAutoConfiguration启动Spring的自动配置,但是如果在不同的配置类上同时使用,将导致自动配置的排除属性无效. 接下来从源码分析问题.
该注解上标记有@Import(AutoConfigurationImportSelector.class),作用其实就是解析Spring的spi文件spring.factories中key为“org.springframework.boot.autoconfigure.EnableAutoConfiguration”的自动配置内,将其注入到Spring的容器中,AutoConfigurationImportSelector实现了DeferredImportSelector接口,Spring会在类扫描完成后回调该接口,当回调到AutoConfigurationImportSelector实例时,会读取所有classpath中spring.factories文件中key为“...EnableAutoConfiguration”的自动配置类,存到集合中。但是如果@EnableAutoConfiguration中的exclude属性指定了具体排除的某个自动配置类,那么就会从集合中移除该自动配置类.
如果项目中不同配置类同时使用@EnableAutoConfiguration注解,就会被多次解析, 如果其中一个注解指定了exclude属性,而另一个没有指定exclude属性, 会导致第一处指定的exclude自动配置类,在第二处被加载进来。导致exclude属性指定失败。
如果两处配置都指定了相同的exclude属性,则完全是没有必要,他们达到的效果是完全一样的。
因此项目中只要有一处配置类上使用@EnableAutoConfiguration注解即可。而在SpringBoot的启动注解@SpringBootApplication上其实已经默认加了该注解,因此没有必要自己手动使用该注解。
当然在同一个配置类上,可以手动使用@EnableAutoConfiguration来覆盖@SpringBootApplication注解上的@EnableAutoConfiguration注解设置。