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

有关java中的spi

这个图是从别的地方找来的:大概的就是这样

主要说的是 spi机制的核心类:

ServiceLoader主要通过以下一些关键方法来实现其服务加载功能:

load方法

  • 功能load方法是ServiceLoader的核心方法之一,用于创建一个ServiceLoader实例并开始加载指定服务接口的服务提供者。它有两种重载形式:
    • public static <S> ServiceLoader<S> load(Class<S> service):该方法接受一个服务接口的Class对象作为参数,使用当前线程的上下文类加载器来加载该接口的服务提供者。
    • public static <S> ServiceLoader<S> load(Class<S> service, ClassLoader loader):除了服务接口的Class对象外,还接受一个指定的类加载器作为参数,使用该类加载器来加载服务提供者。
  • 实现原理:在load方法内部,它首先创建一个新的ServiceLoader对象,然后调用该对象的reload方法来执行实际的加载操作。reload方法会清除之前加载的任何服务提供者缓存,并重新读取配置文件并加载服务提供者。

reload方法

  • 功能reload方法用于重新加载服务提供者。它会清除ServiceLoader内部的缓存,然后重新查找和加载服务接口的服务提供者。
  • 实现原理:在reload方法中,首先会通过providers字段的clear方法清除已加载服务提供者的缓存。然后,通过调用lookupIterator方法创建一个新的迭代器,该迭代器会在后续的迭代过程中负责查找和加载服务提供者。

lookupIterator方法

  • 功能lookupIterator方法用于创建一个迭代器,该迭代器在迭代过程中负责查找和加载服务提供者。它返回一个实现了Iterator接口的内部类Providers的实例。
  • 实现原理:在lookupIterator方法内部,首先获取类加载器,然后通过类加载器查找META-INF/services目录下与服务接口全限定名对应的配置文件。接着,使用BufferedReader读取配置文件的内容,每行的内容被视为一个服务提供者的全限定名。最后,根据这些全限定名,使用类加载器加载相应的类,并通过反射机制创建服务提供者的实例,将这些实例包装成Provider接口的实现类对象,放入一个迭代器中返回。

iterator方法

  • 功能iterator方法用于返回一个迭代器,通过该迭代器可以遍历所有已加载的服务提供者。它直接返回lookupIterator方法创建的迭代器。
  • 实现原理:在iterator方法中,直接返回lookupIterator方法创建的迭代器对象,使得外部可以通过迭代的方式获取所有已加载的服务提供者实例。

Provider接口的get方法

  • 功能Provider接口是ServiceLoader的一个内部接口,它定义了一个get方法。服务提供者的加载和实例化后的对象会被包装成实现Provider接口的类,通过get方法可以获取到服务提供者的实例。
  • 实现原理:在实现Provider接口的类中,get方法通常直接返回包装的服务提供者实例。例如,在ServiceLoader的内部实现中,LazyIterator类在加载服务提供者后,会将实例包装成ServiceLoader.Provider接口的实现类,get方法就直接返回这个实例,以便外部可以通过Provider接口获取和使用服务提供者的实例。

通过这些主要方法的协同工作,ServiceLoader实现了服务提供者的动态加载、缓存管理以及迭代访问等功能,为 Java 应用程序提供了一种灵活的服务加载机制。

比如在 DriverManager类 (jdk 17 的Java.sql包下的) 静态方法ensureDriversInitialized()下

结合上面 ServiceLoader 主要核心类来看,

 ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
  Iterator<Driver> driversIterator = loadedDrivers.iterator();

ServiceLoader类(jdk 17 java.base包下)这个应该是通过启动类加载器加载的 然后拿到迭代器来获取。把DriverManager类加载好后,就可以直接给其他的数据库引用加载自己的类了。

比如 mysql (maven 项目)

mysql 通过自己的spi 扫描这个文件 

java.sql.Driver文件:

找到这个类

这里面就是整个spi的大概流程。对于疑惑的时候可以来看看。


http://www.kler.cn/news/360269.html

相关文章:

  • element plus el-checkbox 无法选中问题
  • 图片翻译软件有哪些?好用的在线图片翻译工具大盘点
  • Java基础day01---一、Typora--markdown编辑器的使用以及java基础
  • 互联网人口红利趋缓下的社群粉丝经济新模式探索
  • 第五天 基础项目实践
  • 百鸡问题c++
  • 限时设计ui
  • 在终端怎么升级Python
  • [已解决] pycharm添加本地conda虚拟环境 + 配置解释器 - pycharm找不到conda可执行文件
  • 在win系统上做生信数据分析如何快速检查和填写正确的文件路径
  • 深入探索Python集合(Set)的高效应用:数据处理、性能优化与实际案例分析
  • 银行卡归属地接口-在线银行卡归属地-银行卡归属地API
  • 【深度解析】WRF-LES与PALM微尺度气象大涡模拟
  • tkinter Listbox 列表框实现多列对齐排列并绑定下拉框和滚动条
  • Java:玩家打怪小游戏
  • 【GO实战课】第六讲:电子商务网站(6):支付和订单处理
  • 工厂设计模式(Factory Pattern)
  • vue与u3d互调
  • 《Linux运维》之解决“Failed to start LSB: Bring up/down networking.“问题的方法
  • R语言医学数据分析实践-糖尿病风险预测实战