springboot核心注解@EnableAutoConfiguration会导入@Import(AutoConfigurationImportSelector.class),这个类实现了DeferredImportSelector接口,即可以达到spring完成bean的初始化之后会回调该接口的selectImports方法,方法的参数是各个bean的类属性,注解等,返回的bean才会导入到spring中。AutoConfigurationImportSelector实现逻辑如下:
该方法逻辑大致就是加载各个jar包下的spring.factories配置文件,读取出自动配置的类,然后去掉重复的以及需要排除的,然后进行过滤,即filter方法,该方法如下: 重点看第一个for循环,getAutoConfigurationImportFilters()会返回所有AutoConfigurationImportFilter的实现类,目前只有OnClassCondition这个类实现了该接口,即返回的都是OnClassCondition类的对象,而OnClassCondition继承自SpringBootCondition,match会根据条件过滤掉不符合条件的配置类,留下符合条件的配置类,从而被AutoConfigurationImportSelector注入spring完成加载。这里说一下match方法是如何处理ConditionOnClass注解的,看实现,其中的getOutcomes方法实现,其中使用createOutcomesResolver方法创建了2个OutcomesResolver,需要注意的是,留下了一半的解析任务放在新开线程中实现以获得更好的性能,这里主要看StandardOutcomesResolver的实现,对应的实现方法: 可以看到读取了类上面的ConditionalOnClass注解的值,然后和环境中进行匹配,如果存在就返回ConditionOutcome对象,存在返回空。经过这些过滤,最终由上面说的AutoConfigurationImportSelector类返回后被spring加载从而实现了条件注解的配置功能。 另外@configuration类会在ConfigurationClassPostProcessor中进行处理,一些其他类型的@Condition条件判断等,如OnJavaCondition注解等,会在这里处理,这里不再赘述。