SPI的定义:全称为service provider interface。专业术语为:服务提供接口。大白话就是:可以根据给定的接口加载具体的实现类。一般可用作第三方实现或扩展的接口。
优点:
解耦。不需要改动源码就可实现扩展。没有侵入性。扩展也不需要改动原来代码只需要添加配置就可实现扩展,符合开闭原则(对扩展开放,对修改关闭)。
缺点:
1. 代码中写死了路径,只能放在META-INF/services路径下
2. 代码中只能遍历所有的实现,并全部示例化。如果不是都需要用实现类,则会浪费性能。
3. 接口名文件内容可以配置所有的扩展实现,但是没有命名(别名)。有多个实现类时导致程序很难寻找。
使用示例:
1、定义一个接口
public interface Person {
String say();
}
2、接口实现两个实现类
public class Women implements Person {
@Override
public String say() {
System.out.println("我是女人");
}
}
public class Man implements Person {
@Override
public String say() {
System.out.println("我是男人");
}
}
3、在类路径下创建两层文件夹META-INF/services,增加一个文件,文件名是接口的全限定名
文件内容是接口实现类的全限定名,可以有多个实现类
4、增加一个主类
public class mainApp {
public static void main(String[] args) {
ServiceLoader<Person> persons = ServiceLoader.load(Person.class);
for (Person person: persons ) {
System.out.println(person.say());
}
}
}
5、执行结果