SPI机制简单示例


spi(Service Provider Interface)是一种服务发现机制,主要对接口进行解耦,实现对装配类的动态加载。本文只讲如何使用spi,不去分析它的源码。

1. 在classpath下创建META-INF/services文件夹

ServiceLoader将会扫描META-INF/services下的文件

2. 创建以父类或接口的完全限定名为名的文件

比如创建一个接口名为Animal,它的完全限定名为io.github.iamazy.asm.spi.Animal,则在META-INF/services文件夹下创建文件io.github.iamazy.asm.spi.Animal

Animal接口内容如下:

package io.github.iamazy.asm.spi;

public interface Animal {
    String name();
}

3. 在io.github.iamazy.asm.spi.Animal文件中添加子类的完全限定名

创建Animal的子类DogCat,类文件内容如下:

// Dog.java
package io.github.iamazy.asm.spi;

public class Dog implements Animal {
    @Override
    public String name() {
        return "DOG";
    }
}

// Cat.java
package io.github.iamazy.asm.spi;

public class Cat implements Animal {
    @Override
    public String name() {
        return "CAT";
    }
}

io.github.iamazy.asm.spi.Animal文件内容应为:

io.github.iamazy.asm.spi.Dog
io.github.iamazy.asm.spi.Cat

4. 使用ServiceLoader加载

在main方法中使用ServiceLoader加载Animal接口

public static void main(String[] args) {
    ServiceLoader<Animal> animals = ServiceLoader.load(Animal.class);
    for(Animal animal:animals){
        System.out.println(animal.name());
    }
}

文章作者: iamazy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 iamazy !
 上一篇
awesome-c/c++ awesome-c/c++
repository watch star fork read awesome-c modern-cpp-tutorial awesome-modern-cpp awesome-cpp
2020-03-21
下一篇 
class文件格式 class文件格式
学习Java的同学对class文件可能不会陌生,它是.java文件编译后生成的字节码文件(扩展名为.class),它是Java语言一次编译,处处运行的基础,也是其他jvm语言运行在jvm上的基础。 1. class文件结构一个class
2020-03-17
  目录