AutoConfiguration加载元数据和自动配置组件

@EnableAutoConfiguration 加载元数据配置加载元数据配置主要是为后续操作提供数据支持 。
我们先来看加载相关源代码的具体实现 , 该功能的代码依旧日在 selectlmpots 方法内 。
@Overridepublic String[] selectImports (AnnotationMetadata annotationMetadata) {AutoConfigurat ionMetadata autoConf igurationMetadata = http://kandian.youth.cn/index/AutoConfigurationMetadataLoader. loadMetadata(this. beanClassLoader);}加载元数据的配置用到了AutoConfigurationMetadataLoader类提供的loadMetaData方法 , 该方法会默认加载类路径下 META-INF/springautoconfigure-metadata.properties 内的配置 。
final class AutoConfigurationMetadataLoader {//默认加载元数据的路径protected static final String PATH = "META- INF/spring- autoconfigure - metadata.properties";//默认调用改方法 , 传入默认 PATHstatic AutoConfigurat ionMetadata loadMetadata(ClassLoader classLoader )return loadMetadata(classLoader, PATH);static AutoConfigurationMetadata loadMetadata(ClassLoader classLoader, Stringpath) {try//获取数据存储 FEnumeration 中Enumeration urls = (classLoader != null) ? classLoader . getResources(path): ClassLoader . getSys temResources(path);Properties properties = new Properties();while (urls.hasMoreElements()) {//遍历 Enumeration 中的 URL , 加载其中的属性 ,存储到 Properties 中properties . putAll(PropertiesLoaderUtils. loadProperties (new UrlResource(urls .nextElement())));}return loadMetadata(properties);} catch (IOException ex) {throw new IllegalArgumentException("Unable to load @ConditionalOnClas; location [" + path + "]" , ex);//创建 AutoConfigurat ionMe tadata 的实现类 PropertiesAutoConf igurat ionMetadatstatic AutoConfigurationMetadata loadMetadata(Properties properties) {return new PropertiesAutoConfigurationMetadata(properties);// AutoConfigurationMetadata 的内部实现类private static class PropertiesAutoConfigurationMetadata implements AutoCon-figurat ionMetadata { 。。。 } 。。。 }在上面的代码中 AutoConfigurationMetadataLoader 调用 ladMetadaClassLoadar cassLoaden)方法 , 会获取默认变量 PATH 指定的文件 , 然后加载并存储于 Enumeration 数据结构中 。 随后从变量 PATH 指定的文件中获取其中配置的属性存诸 Poperties 内 , 最终调用在该类内部实现的 AutoConfigurationMetadata 的子类的构造方法 。
spring-autoconfigure-metadata.properties 文件内的配置格式如下 。
自动配置类的全限定名.注解名称=值
如果 spnaotningre-etadata properties 文件内有多个值 , 就用英文逗号分隔 , 例如:
org. springframework . boot . autoconfigure . data. jdbc . IdbcRepositoriesAutoConfiguration . ConditionalOnClass=org. springframework. data. jdbc . repos itory. config.JdbcConfigurat ion, org. springframework. jdbc . core . namedpar am .NamedParameterJdbcOperations 。。。 为什么要加载此元数据呢?加载元数据主要是为了后续过滤自动配置使用 。 Spring Boot 使用-Annlation 的处理器来收集自动加载的条件 , 这些条件可以在元数据文件中进行配置 。 SpingBoot 会将收集好的 C@Confguration 进行一 次过滤 , 进而剔除不满足条件的配置类 。
在官方文档中已经明确指出 , 使用这种配置方式可以有效缩短 SpringBoot 的启动时间 , 减少@oniguraio 类的数量 , 从而减少初始化 ean 的耗时 。 后续章节中我们会看到过滤自动配置的具体使用方法 。