1、开启自动配置的注解
@EnableAutoConfiguration
比如在我们的启动类上一般会有这么个注解
@SpringBootApplication
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
JdbcTemplateAutoConfiguration.class})
public class MultiDataSourceDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MultiDataSourceDemoApplication.class, args);
}
}
从上面的代码我们看不到@EnableAutoConfiguration这个注解,那是如何启动自动配置的?答案就是@SpringBootApplication上已经有了这个注解,如下图。exclude中是不需要自动配置的类,因为我们要自己配置,不用springboot自带的。
2、@EnableAutoConfiguration是如何实现的自动配置
在EnableAutoConfiguration这个类中,import了AutoConfigurationImportSelector。
AutoConfigurationImportSelector类中的getCandidateConfigurations方法。只从Assert中的文字中可以看出,是从META-INF/spring.factories加载的自动配置类,当然,这个方法点进去后也能看到。
我们去找一下META-INF/spring.factories这个文件,看看里面有什么。从下面的图片中我们看到了,里面全是一些配置类的路径,根据这些路径就会找到这些配置类,并自动加载到spring容器中。也就是说META-INF/spring.factories中存放的就是springboot会自动配置的类。
3、总结一下:
@SpringBootApplication注解实现了@EnableAutoConfiguration这个注解,而EnableAutoConfiguration又import了AutoConfigurationImportSelector这个类。AutoConfigurationImportSelector的getCandidateConfigurations方法会去加载META-INF/spring.factories中的类,这样就实现了自动配置。
如果我们想自己配置,比如实现多个数据源的配置。那就需要用上面所提到的exclude方式排除掉与之相关的自动配置类,比如DataSourceAutoConfiguration。
4、条件注解
springboot会根据这些条件注解,符合条件注解的才会去自动配置。
@Conditional:这注解会指定一个类,这个类中有一些条件判断,符合这个类中的条件判断才会生效。
@ConditionalOnClass:当我的classpath中出现某个类的时候生效。
@ConditionalOnBean:在spring容器中已经存在某个bean的时候生效。
@ConditionalOnMissingBean:在不存在某个bean的条件下生效。
@ConditionalOnProperity.........
可以自己在META-INF/spring.factories随便找一个类,点击去看看,一般都会用到一个或多个条件注解。