当前位置: 首页 > news >正文

spring spi源码

spring spi是啥

spring spi机制是spring实现自动装配的基础机制。

spi源码

public final class SpringFactoriesLoader{// 指定读取路径public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";// 用来缓存的容器private static final Map<ClassLoader, MultiValueMap<String, String>> cache = new ConcurrentReferenceHashMap<>();public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {String factoryTypeName = factoryType.getName();return loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());}private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {// 取缓存or加载解析MultiValueMap<String, String> result = cache.get(classLoader);if (result != null) {return result;}try {// 利用类加载器加载所有的spring.factoriesEnumeration<URL> urls = (classLoader != null ?classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));result = new LinkedMultiValueMap<>();// 逐个解析while (urls.hasMoreElements()) {// 提取每个spring.factories文件URL url = urls.nextElement();UrlResource resource = new UrlResource(url);// 读取spring.factories文件Properties properties = PropertiesLoaderUtils.loadProperties(resource);// 逐个收集映射for (Map.Entry<?, ?> entry : properties.entrySet()) {String factoryTypeName = ((String) entry.getKey()).trim();// 如果一个key有多个value,则用英文逗号隔开,在这里做分隔for (String factoryImplementationName : StringUtils.commaDelimitedListToStringArray((String) entry.getValue())) {result.add(factoryTypeName, factoryImplementationName.trim());}}}cache.put(classLoader, result);return result;}catch (IOException ex) {throw new IllegalArgumentException("Unable to load factories from location [" +FACTORIES_RESOURCE_LOCATION + "]", ex);}}	
}

逻辑简述

spi第一次执行时会通过类加载器读取指定路径的文件。这个文件其实就是spring的properties文件。
第一次读取后,会用ConcurrentReferenceHashMap进行缓存。
每个spring.factories文件都会被当作一个Properties对象进行解析,可以提取每一对映射关系,最终存到Map中。

http://www.lqws.cn/news/555931.html

相关文章:

  • 恐怖黎明 决定版 中文 免安 离线运行版
  • 《卷积神经网络到Vision Transformer:计算机视觉的十年架构革命》
  • 【SpringBoot高级】SpringBoot与Kafka深度整合:从入门到企业级实战
  • zookeeper Curator(3):Watch事件监听
  • 使用 Socket.IO 和 TypeScript 由 WebSockets 驱动的聊天应用程序
  • JavaScript中的显式原型与隐式原型:深入理解原型链
  • 车辆车五项查询API: Python 示例
  • Stewart并联结构两自由度正逆解计算和工作空间仿真
  • Word之电子章制作——1
  • 探索钉钉生态中的宜搭:创建与分享应用的新视界
  • 服务器的维护技术都有哪些?
  • docker+n8n的工作流中无法使用本地ollama服务的问题
  • InnoDB的undo日志涉及的页结构
  • mmap映射物理内存之一cache与lock
  • GeoTools 结合 OpenLayers 实现属性查询
  • Stable Diffusion入门-ControlNet 深入理解 第四课:风格迁移与重绘控制模型——让AI也有“艺术天赋”!
  • Git安装避坑指南
  • 【编程实践】利用python在Blender生成三维模型
  • Kafka 消费者重平衡问题排查与优化实践
  • 在单片机中如何实现一个shell控制台
  • 阿里云-arms监控
  • zookeeper Curator(1):认识zookeeper和操作命令
  • 华为云鸿蒙应用入门级开发者认证 实验部分题目及操作步骤
  • 【龙泽科技】新能源汽车故障诊断仿真教学软件【吉利几何G6】
  • Qt:QCustomPlot库的QCPAxis
  • 第一章 城镇道路工程 1.5 安全质量控制
  • python解释器 与 pip脚本常遇到的问题汇总
  • PYTHON从入门到实践7-获取用户输入与while循环
  • 医疗标准集中标准化存储与人工智能智能更新协同路径研究(上)
  • Next.js实战:AI两小时开发文档社区