通过springboot启动类的注解@SpringBootApplication
关注注解@EnableAutoConfiguration
点进去看这个类AutoConfigurationImportSelector的selectImports方法
关注方法getCandidateConfigurations
再到
重头戏来了,加载META-INF/spring.factories这个文件
spring.factories这个文件,这个key: EnableAutoConfiguration对应下的自动配置类都会被加载
但是这些类是否自动配置,是根据其类上的注解@ConditionalOnClass等等来判断是否生效的
springboot项目启动时,会扫描所有jar包中的spring.factories文件,从而拿到其需加载的自动配置类,而这些配置类是否真实生效,又根据其类上注解决定
例如
数据源DataSource的自动配置 org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
生效条件是@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) 存在DataSource和EmbeddedDatabaseType
redis的自动配置org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
其生效条件是@ConditionalOnClass(RedisOperations.class) 存在RedisOperations
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
当pom中引入spring-boot-starter-data-redis时,RedisAutoConfiguration自动配置类生效会被加载到内存中
其他mq、mongo等等同理
未完待续...