源码流程图
我们找几个比较重要的方法来讲一下
getAutoConfigurationEntry
主要的功能:进行扫描具有META-INF/spring.factories
文件的jar包
/** * Return the {@link AutoConfigurationEntry} based on the {@link AnnotationMetadata} * of the importing {@link Configuration @Configuration} class. * @param annotationMetadata the annotation metadata of the configuration class * @return the auto-configurations that should be imported */ protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) { if (!isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } AnnotationAttributes attributes = getAttributes(annotationMetadata); // 从META-INF/spring.factories中获得候选的自动配置类 List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes); // 排重 configurations = removeDuplicates(configurations); //根据EnableAutoConfiguration注解中属性,获取不需要自动装配的类名单 Set<String> exclusions = getExclusions(annotationMetadata, attributes); // 根据:@EnableAutoConfiguration.exclude // @EnableAutoConfiguration.excludeName // spring.autoconfigure.exclude 进行排除 checkExcludedClasses(configurations, exclusions); // exclusions 也排除 configurations.removeAll(exclusions); configurations = getConfigurationClassFilter().filter(configurations); // 这个方法是调用实现了AutoConfigurationImportListener的bean.. 分别把候选的配置名单,和排除的配置名单传进去做扩展 fireAutoConfigurationImportEvents(configurations, exclusions); return new AutoConfigurationEntry(configurations, exclusions); }
我们知道任何一个springboot应用,都会引入spring-boot-autoconfigure,而spring.factories文件就在该包下面。
spring.factories文件是Key=Value形式,多个Value时使用,隔开,该文件中定义了关于初始化,监听器等信息,而真正使自动配置生效的key是org.springframework.boot.autoconfigure.EnableAutoConfiguration。
@EnableAutoConfiguration注解通过@SpringBootApplication被间接的标记在了Spring Boot的启动类上。在SpringApplication.run(…)的内部就会执行selectImports()方法,找到所有JavaConfig自动配置类的全限定名对应的class,然后将所有自动配置类加载到Spring容器中.
源码图地址
图画好了, 戳这里