过程
@SpringBootApplication——>@EnableAutoConfiguration——>@Import提供,其导入的AutoConfigurationImportSelector的selectImports()方法
SpringFactoriesLoader.loadFactoryNames()扫描所有具有META-INF/spring.factories的jar包下面key是EnableAutoConfiguration全名的,所有自动配置类。
看看SpringBoot的spring-boot-autoconfigure-xxx.jar
该jar包里面就有META-INF/spring.factories文件。
这个spring.factories文件是一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,而它的value是一个xxxxAutoConfiguration的类名的列表,这些类名以逗号分隔。
自动配置核心方法
AutoConfigurationImportSelector.selectImports
该方法会找到自动配置的类,并给打了@Bean注解的方法创建对象。
postProcessBeanDefinitionRegistry方法是最核心的方法,它负责解析@Configuration、@Import、@ImportSource、@Component、@ComponentScan、@Bean等,完成bean的自动配置功能。
属性的自动配置
是通过ConfigurationPropertiesBindingPostProcessor类的postProcessBeforeInitialization方法完成
自动配置的生效条件
每个xxxxAutoConfiguration类上都可以定义一些生效条件,这些条件基本都是从@Conditional派生出来的。
常用的条件如下:
@ConditionalOnBean:当容器里有指定的bean时生效
@ConditionalOnMissingBean:当容器里不存在指定bean时生效
@ConditionalOnClass:当类路径下有指定类时生效
@ConditionalOnMissingClass:当类路径下不存在指定类时生效
@ConditionalOnProperty:指定的属性是否有指定的值,比如@ConditionalOnProperties(prefix=”xxx.xxx”, value=”enable”, matchIfMissing=true),代表当xxx.xxx为enable时条件的布尔值为true,如果没有设置的情况下也为true。