Java SPI的使用

本文介绍了Java SPI(Service Provider Interface)的基本概念,包括其机制、使用步骤和注意事项。通过一个详细的示例,展示了如何创建接口、实现类,配置META-INF/services文件,并在测试类中加载并使用SPI服务。最后,文章简要总结了JDK原生SPI的使用,并预告了后续关于自定义SPI的内容。

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

Java SPI的使用

前言

什么是SPI?SPI 的全称 Service Provider Interface,是 Java 提供的一套用来被第三方实现或者扩展的 API,机制如下图:

调用
本地服务发现服务加载
调用方
标准服务接口
服务提供方
实现类A
实现类B

如何使用

要使用 Java SPI,需要遵循下面的几点约定:

  1. 当服务提供者提供了接口的一种具体实现后,在 jar 包的 META-INF/services 目录下创建一个以“接口全限定名”为命名的文件,内容为实现类的全限定名;
  2. 接口实现类所在的 jar 包放在主程序的 classpath 中;
  3. 主程序通过 java.util.ServiceLoder 动态装载实现模块,扫描 META-INF/services 目录下的配置文件找到实现类的全限定名,把类加载到 JVM;
  4. SPI的实现类必须携带一个不带参数的构造方法;

示例

  1. 首先定义好接口
    public interface DataSourceSpi {
    
        /**
         * 连接方法
         * @param urlName
         */
        void connection(String urlName);
    }
    
  2. 定义两个实现类
    public class MysqlDataSource implements DataSourceSpi {
    
        public void connection(String urlName) {
            System.out.println("MySQL Connection url:" + urlName);
        }
    }
    public class OracleDataSource implements DataSourceSpi {
    
        public void connection(String urlName) {
            System.out.println("Oracle Connection url:" + urlName);
        }
    }
    
  3. 然后在 src 下新建 resources 包,按约定新建好 META-INF/services 文件夹,再新建一个定义好接口的全限定类名的文件,我这里是 com.zenglh.spi.DataSourceSpi。
    在这里插入图片描述
  4. 新建完文件后,在类里面把实现类的全限定类名写上,每个类一行:
    com.zenglh.spi.impl.MysqlDataSource
    com.zenglh.spi.impl.OracleDataSource
    
  5. 最后新建一个测试类,来测试一下是否成功
    public class SpiMain {
    
        public static void main(String[] args) {
            ServiceLoader<DataSourceSpi> dataSourceSpis = ServiceLoader.load(DataSourceSpi.class);
            for (DataSourceSpi spi :
                    dataSourceSpis) {
                spi.connection("10.xxx.xxx.xxx:3306");
            }
    
        }
    
    }
    
    如果输出来下面这样的,就说明成功了 在这里插入图片描述

总结

JDK 中原生的 Spi 只要按照约定的地方配置好,然后就可以使用了,后续再写一往篇自己实现的 Spi。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值