一、自动配置的核心
一般springboot程序,我们都会在主启动类上加上@SpringBootApplication注解,@SpringBootApplication是一个复合注解,上面标注了@ComponeScan,@EnableAutoConfiguration,默认开启了包扫码和自动配置。
@EnableAutoConfiguration注解上使用@Import导入了一个类,EnableAutoConfigurationImportSelector
EnableAutoConfigurationImportSelector的父类中AutoConfigurationImportSelector
有一个关键的方法selectImports(),这个方法会去找classpath下,名为spring.factories配置文件里面的需要自动配置的类列表
这里的factoryClassName就是 org.springframework.boot.autoconfigure.EnableAutoConfiguration ,后面通过classLoader加载spring-boot-autoconfigure.jar META-INF/spring.factories 文件,然后通过
factoryClassName找到对应的自动配置类
注:(spring.factories文件自动配置类列表还是很好用的,比如有些时候我们需要排除某个自动配置,而你又不知道它到底有几个配置类,可以参照这里)
有了自动配置类列表还没完,springboot需要知道列表里面那些配置是我们需要的,通过什么来判断呢?springboot最主要是通过了@Conditional家族注解,判断classpath有没有某个类,容器中有没有某个bean,application.yml文件中有没有某一条属性并且这个属性为某个值等等这些条件来判断,我是否需要装载这个配置类
下面以elasticsearch为例
springboot要装载elasticsearch配置需要满足以下条件:
- classpath下面必须要有 org.elasticsearch.client.Client TransportClientFactoryBean NodeClientFactoryBean 三个class文件
- 如果springboot上下文中没有名为 elasticsearchClient 的bean,我们如果配置了这个bean存在于上下文,那么自动配置就不会触发了
二、@Conditional
看了上面应该知道 ,@Conditional的这些注解是是否启用自动配置类的关键。下图来自《Spring Boot实战》一书:
三、总结
简单来说,Spring Boot的自动配置分为以下几个步骤:
1、@EnableAutoConfiguration注解开启自动配置,并找到spring-boot-autoconfigure.jar包里的 META-INF/spring.factories 文件
2、通过factoryClassName找到 META-INF/spring.factories 文件对应的自动配置类列表
3、springboot上下文根据自动配置类里的 @Conditional 家族注解选择是否要加载这些配置