@EnableAutoConfiguration(自动装配的注解)
它有两个属性exclude()与excludeName(),标识排除的类
在该注解中引入了 (AutoConfigurationImportSelector.class)
这个类的主要作用就是筛选出所需要的配置类,在它里边有一个方法-
getAutoConfigurationEntry(AnnotationMetadata annotationMetadata)
就是筛选自动配置类的核心方法
主要流程为:(分析上图代码)
1、首先获取@EnableAutoConfiguration 中的注解属性
2、getCandidateConfigurations到缓存中获取自动配置类的类名
loadFactoryNames(),会根据第一个参数,只会获取跟自动配置类相关的类名
loadSpringFactories具体的逻辑代码(下图)
2.1、如果内存中有类名的集合,则直接返回
2.2、如果没有则进入try语句块
2.2.1、首先获取所有jar包下的,所有的spring.factories文件的路径。
2.2.2、遍历所有路径下的spring.factories文件,获取文件中的数据并以键值对的形式存入properties对象中。
2.2.3、由于值有可能是多个,所以遍历再次properties对象,存入LinkedMultiValueMap<>()中。注:键是接口名字,值是实现类,即要生成的bean
2.2.4、最后把所得的结果返回,并存入缓存。
这时会返回到loadFactoryNames()方法中,会根据factoryTypeName,只会获取跟自动配置类相关的实现类的类名。
3、获取了所有的实现类之后,再进行几次筛选
3.1、removeDuplicates()去除重复的类名(导包时如果引入相同的配置,则可能会出现重复的类名,使用linkedHashSet去重)
3.2、checkExcludedClasses()根据最开始获取的注解的属性(exclude()与excludeName()),排除不需要配置的类。
3.3、getConfigurationClassFilter().filter(configurations);过滤掉没有引用的配置类(根据pom文件中的starter),返回list<String>集合。
4、经过层层选拔,最终剩下的实现类的全类名,就是要被自动配置的类。bean的初始化其实有spring来完成,boot只负责筛选出需要初始化的类。