一线大牛带你深入解析AutoConfiguration源码( 二 )


DeferredlmportSelector 的加载顺序可以通过@Order 注解或实现 Ordered 接口来指定 。 同时 , DeferredlmportSelector 提供了新的方法 getlmportGroup()来跨 DeferredlmportSelector实现自定义 Configuration 的加载顺序 。
AutoConfigurationlmportSelector 功能概述
下面我们通过图 2-3 所示的流程图来从整体上了解 AutoConfigurationlmportSelector 的核心功能及流程 , 然后再对照代码看具体的功能实现 。 图 2-3 中省略了外部通过@Import 注解调用该类的部分 。
一线大牛带你深入解析AutoConfiguration源码文章插图
当 AutoConfigurationlmportSelector 被@lmport 注解引入之后 , 它的 slectmports 方法会被调用并执行其实现的自动装配逻辑 。 读者朋友需注意 , seletmports 方法几乎涵盖了组件自动装配的所有处理逻辑 。
AhtonfiruriomoprSelelereleltiports 方法源代码如下:
@Overridepublic String[ ] selectImports (AnnotationMetadata annotationMetadata) {//检查自动配置功能是否开肩 , 默认为开启if (!isEnabled(annotat ionMetadata)) {return NO_ IMPORTS;//加戴自动配置的元信息 , 配置文件为类路径中 META-INF 目录下的// spring-autoconfigure -metadata. properties 文件AutoConfigurationMetadata autoConfigurationMetadata = http://kandian.youth.cn/index/AutoConfigurationMetadataLoader. loadMetadata(this . beanClassLoader);//封装将被引入的自动配置信息AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntryautoConfigurationMetadata, annotationMetadata) ;//返回符合条件的配置类的全限定名数组return StringUtils. toStringArray(autoConfigurationEntry. getConfigurations());}protected AutoConfigurationEntry getAutoConfigurat ionEntry(AutoConfigurat ionMetadata autoConfi gurationMetadata,Annotat ionMetadata annotationMetadata) {if (!isEnabled( annotationMetadata)) {return EMPTY_ ENTRY;}AnnotationAttributes attributes = getAttributes ( annotat ionMetadata);//通过 SpringFactoriesLoader 类提供的方法加戴类路径中 META-INF 目录下的// spring . factories 文件中针对 EnableAutoConfigurat ion 的往册配置类List configurations = getCandidateConfigurations (annotationMetadata,attributes);//对获得的注册配置类集合进行去重处理 , 防止多个项目引入同样的配置类 configurations =removeDuplicates( configurations);//获得炷解中被 excLude.或 excLudeName 所排除的类的集合Set exclusions = getExclusions ( annotationMetadata, attributes);//检查被排除类是否可实例化 , 是否被自动注册配置所使用 , 不符合条件则抛出异常checkExcludedClasses (configurations, exclusions);//从自动配置类集合中去除被排除的类configurations . removeAll(exclusions);//检查配置类的注解是否符合 spring . factories 文件中 AutoConfigurat ionImportFilter.指定的注解检查条件configurations = filter( configurations, autoConfigurationMetadata);//将筛选完成的配置类和排查的配置类构建为事件类 ,并传入监听器 。 监听器的配置在Fspring . factories 文件中 , 通过 AutoConf igurat ionImportL istener 指定fireAutoConfigurationImportEvents( configurations, exclusions);return new AutoConfigurat ionEntry(configurations, exclusions);}通过图 2-3 和上述代码 , 我们从整体层面了解了 AutoConfigurationlmportSelector 的概况及操作流程 , 后文将对这些流程进行细化拆分 , 并通过阅读源代码来分析 Sprng Boot 是如何实现自动加载功能的 。


推荐阅读