spi思想

276 阅读1分钟

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、执行结果