SPI入门

本文深入解析SPI(服务提供者接口)与API(应用程序编程接口)的区别与联系,介绍如何使用SPI在程序中动态加载实现类,通过具体示例说明SPI在实际应用中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前只听过API(Application Programming Interface), 偶然在公司的源码中看到一个ExtensionLoader这个类,字面的意思是拓展加载器,在之前学的JVM的类加载机制双亲委派模型其中有Bootstrap,Extension,Application加载器。

通过这个类获取某个接口的具体的实现类,后来学习到了一个新的单词叫做SPI(Service Provider Interface), 服务的提供者在实现一个接口后,在META-INF目录下的services目录下创建相应接口的名称的文件,文件内容为服务提供者实现接口的类的全限定名:

mysql提供的Driver实现
这里写图片描述

在程序中DriverManager.getDriver(“com.mysql.jdbc.Driver”)就会从services目录下加载这个类

API和SPI
自己的理解:API通过调用SPI接口的方法实现功能,而程序会寻找这个SPI的实现来完成相应的功能,API不管SPI的具体的实现,感觉SPI是API的基础。

demo

public interface Search {
    List<String> search();
}

public class CacheSearch implements Search {
    @Override
    public List<String> search() {
        System.out.println("Search in cache.");
        return null;
    }
}

public class DataBaseSearch implements Search {

    @Override
    public List<String> search() {
        System.out.println("Search in database.");
        return null;
    }
}
 // 通过ServiceLoader加载实现类
 public static void main(String[] args) {
        ServiceLoader<Search> searchServiceLoader = ServiceLoader.load(Search.class);
        for (Search search : searchServiceLoader) {
            search.search();
        }
 }

这里写图片描述

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值