Fork me on Gitee

Java SPI 使用与注意

Java SPI 示例


image_thumb1


前面简单介绍了 SPI 机制的原理,本节通过一个示例演示 Java SPI 的使用方法。首先,我们定义一个接口,名称为 Robot。

public interface Robot {
    void sayHello();
}

接下来定义两个实现类,分别为 OptimusPrime 和 Bumblebee。

public class OptimusPrime implements Robot {
    
    @Override
    public void sayHello() {
        System.out.println("Hello, I am Optimus Prime.");
    }
}

public class Bumblebee implements Robot {

    @Override
    public void sayHello() {
        System.out.println("Hello, I am Bumblebee.");
    }
}

接下来 META-INF/services 文件夹下创建一个文件,名称为 Robot 的全限定名 org.apache.spi.Robot。文件内容为实现类的全限定的类名,如下:

org.apache.spi.OptimusPrime
org.apache.spi.Bumblebee

做好所需的准备工作,接下来编写代码进行测试。

public class MainTSpi {

    public static void main(String[] args) {
        ServiceLoader<Robot> serviceLoader = ServiceLoader.load(Robot.class);
        System.out.println("Java SPI");
        serviceLoader.forEach(Robot::sayHello);
    }
}

扩展

这时我们 中途 增加一个interface 的实现时l


如:

public class RATCHET implements Robot{
    @Override
    public void sayHello() {
            System.out.println("Hello, I am RATCHET.");
    }
}

则通过以下代码进行接口更新:(更新的同时并不会运行,但是在下次调用的时候 将会执行新实现的接口,并且相同的只会执行一次)

/**
 * @description:
 * @author: Mr.Dai
 * @create: 2020-05-01 21:36
 **/
public class MainTSpi {

    public static void main(String[] args) throws IOException {
        ServiceLoader<Robot> serviceLoader = ServiceLoader.load(Robot.class);
        System.out.println("Java SPI");
        serviceLoader.forEach(Robot::sayHello);
        /**  这里假设重新写法配置文件  */
        String path=System.getProperty("user.dir")+"\\java-important_question\\src\\main\\resources\\META-INF\\services\\com.dgwcode.spi.Robot";
        BufferedWriter writer = new BufferedWriter(new FileWriter(path,true));
        writer.write("\ncom.dgwcode.spi.RATCHET");
        writer.close();
        serviceLoader.reload();
        serviceLoader.forEach(Robot::sayHello);
    }
}

第一次运行

Java SPI
Hello, I am Optimus Prime.
Hello, I am Bumblebee.
Hello, I am Optimus Prime.
Hello, I am Bumblebee.
d

第二次运行

Java SPI
Hello, I am Optimus Prime.
Hello, I am Bumblebee.
Hello, I am RATCHET.
Hello, I am Optimus Prime.
Hello, I am Bumblebee.
Hello, I am RATCHET.
p

配置文件内容:

com.dgwcode.spi.OptimusPrime
com.dgwcode.spi.Bumblebee
com.dgwcode.spi.RATCHET
com.dgwcode.spi.RATCHET
posted @ 2020-05-01 22:02  ---dgw博客  阅读(...)  评论(...编辑  收藏