AutoConfiguration加载元数据和自动配置组件( 二 )
文章插图
@EnableAutoConfiguration 加载自动配置 组件加载自动配置组件是自动配置的核心组件之一 , 这些自动配置组件在类路径中 METAINF 目录下的 Ssping fctories 文件中进行注册 。 Spring Boof 预置了-部分常用组件 , 如果我们需要创建自己的组件 , 可参考 SpringBoot 预置组件在自己的 Starters 中进行配置 , 在后面的章节中会专门对此进行讲解 。
通过 Sping Core 提供的 Soingacaorestoaodar 类可以读取 spring. fctories 文件中注册的类 。 下面我们通过源代码来看一下如何在 AutoConfigurationlmportSelector 类中通过 getCateConfigurations 方法来读取 spring.factories 文件中注册的类 。
protected List getCandidateConfigurat ions (Annotat ionMetadata metadata,AnnotationAttributes attributes) {List configurations = SpringFactoriesLoader . loadF actoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());Assert. notEmpty (configurations ,"No auto configuration classes found in META-INF/spring.factories. If you+ "are using a custom packaging, make sure that file is Correct.");return configurations;protected Class> getSpringF actoriesLoaderFactoryClass() {return EnableAutoConfiguration.class;}
getCandidateConfigurations 方 法 使 用 SpringFactoriesL oader 类 提 供 的loadFactoryNames 方法来读取 META-INF/spring.factories 中的配置 。 如果程序未读取到任何 配 置 内 容,会 抛 出 异 常 信 息。而 loadFactoryNames 方 法 的 第 一 个 参 数 为getSpringFactoriesL oaderFactoryClass 方法返回的 EnableAutoConfiguration.class , 也就是说 loadFactoryNames 只会读取配置文件中针对自动配置的注册类 。
SpringFactoriesLoader 类的 loadFactoryNames 方法相关代码如下 。
public final class SpringFactoriesLoader {//概类加载文件的路径 ,可能存在多个public static final String FACTORIES_ RESOURCE LOCATION = "META- INF/spring. factories";//加载所有的 META- INF/spring. factories.文件 , 封装成 Map, 并从中获取指定类名的列表public static List loadFactoryNames(Class> factoryClass, @Nullable ClassLoader classLoader) {String factoryClassName = factoryClass . getName();return loadSpringFactories (classLoader) . getOrDefault(factoryClassName ,Collections . emptylist());//加载所有的 META- INF/spring. factories 文件 , 封装成 Map ,Key 为接口的全类名 , Value 为对应配置值的 ist 集合private static Map> loadSpringFactories (@Nullable ClassLoader classLoader) {MultiValueMap result = cache.get(classLoader);if (result != null) {return result;try {Enumeration
推荐阅读
- 西部数据在CES 2021推出多款4TB容量的旗舰级SSD
- WhatsApp收集用户数据新政惹众怒,“删除WhatsApp”在土耳其上热搜
- 未来想进入AI领域,该学习Python还是Java大数据开发
- 黑客窃取250万个人数据 意大利运营商提醒用户尽快更换SIM卡
- 阳狮报告:4成受访者认为自己的数据比免费服务更有价值
- 中消协点名大数据网络杀熟 反对利用消费者个人数据画像
- 学习大数据是否需要学习JavaEE
- 意大利运营商Ho Mobile被曝数据泄露
- 微软官方数据恢复工具即将更新:更易于上手 优化恢复性能
- HDMI 2.1诞生三年:超高速数据线落地 8K电视圆满了