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