Java的SPI机制

1. SPI是什么?

SPI即Service Provider Interface,用我不太专业的英语阅读理解就是服务供应者接口,反正大致就是这个意思。

那么这个接口有什么用处呢?或者说在JAVA中,这个东西有什么用?我总结能力比较差,于是我在网上找了一段文字。我觉得这个描述挺好的,至少比我好。

出处:Java SPI (Service Provider Interface) 机制详解


2. SPI的例子

  1. 创建一个接口 ISayHello
package cn.lazyfennec;

public interface ISayHello {

    void sayHello();
}
  1. 创建两个实现类 SayHelloWithChineseSayHelloWithEnglish
  • SayHelloWithChinese
package cn.lazyfennec.sayhello;

import cn.lazyfennec.ISayHello;

/**
 * @Author: Neco
 * @Description:
 * @Date: create in 2022/11/25 15:17
 */
public class SayHelloWithChinese implements ISayHello {

    @Override
    public void sayHello() {
        System.out.println("你好!");
    }

}
  • SayHelloWithEnglish
package cn.lazyfennec.sayhello;

import cn.lazyfennec.ISayHello;

/**
 * @Author: Neco
 * @Description:
 * @Date: create in 2022/11/25 15:16
 */
public class SayHelloWithEnglish implements ISayHello {
    @Override
    public void sayHello() {
        System.out.println("Hello!");
    }
}
  1. 创建如下结构的内容,其中services目录下的文件名称需要与ISayHello接口的全类名一致

  2. 编辑cn.lazyfennec.ISayHello文件的内容,里边每一行对应一个实现类

cn.lazyfennec.sayhello.SayHelloWithChinese
cn.lazyfennec.sayhello.SayHelloWithEnglish
  1. 创建测试类SpiTest,这里会展示如何通过SPI机制获取相关的实现类。
package cn.lazyfennec;

import java.util.ServiceLoader;

/**
 * @Author: Neco
 * @Description:
 * @Date: create in 2022/11/25 15:19
 */
public class SpiTest {

    public static void main(String[] args) {
        ServiceLoader load = ServiceLoader.load(ISayHello.class);
        // 这里打印了ServiceLoader的内容
        System.out.println(load);
        System.out.println("==============这是个分割线=================");

        for (ISayHello sayHello : load) {
            // 打印具体的类名
            System.out.println(sayHello.getClass().getSimpleName());
            // 执行方法
            sayHello.sayHello();
            System.out.println("===============================");
        }
    }
}
  1. 运行结果
java.util.ServiceLoader[cn.lazyfennec.ISayHello]
==============这是个分割线=================
SayHelloWithChinese
你好!
===============================
SayHelloWithEnglish
Hello!
===============================

Process finished with exit code 0

如果觉得有收获,欢迎点赞和评论,更多知识,请点击关注查看我的主页信息哦~

你可能感兴趣的:(Java的SPI机制)