zoukankan      html  css  js  c++  java
  • 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("
    com.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
  • 相关阅读:
    iOS 将对象的属性和属性值拆分成key、value,通过字符串key来获取该属性的值
    [IOI2005] Riv 河流
    [洛谷P4549] [模板] 裴蜀定理
    [NOIp2013] 货车运输
    [NOIp2015] 运输计划
    18.10.01模拟赛总结
    [洛谷P3369] 普通平衡树 Treap & Splay
    [NOIp2016] 组合数问题
    [洛谷P4777] [模板] 扩展中国剩余定理
    [洛谷P3384] [模板] 树链剖分
  • 原文地址:https://www.cnblogs.com/dgwblog/p/12815049.html
Copyright © 2011-2022 走看看