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的子类Dog和Cat,类文件内容如下:
// 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.Cat4. 使用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());
}
}